
# 6. Mixly 教程

## 6.1 资料下载

**Mixly资料包含库文件和项目代码，请点击下载才能进行后续的学习！！！！**

点击下载：[Mixly资料](./Mixly.7z)

## 6.2 Mixly开发环境配置

### 6.2.1 下载软件

我们通过百度网盘分享：mixly2.0 文件

**下载链接：** [https://pan.baidu.com/s/1sV0DUDKg7OiQcKyIkBI1Ew?pwd=keye](https://pan.baidu.com/s/1sV0DUDKg7OiQcKyIkBI1Ew?pwd=keye) 

**提取码：** keye 

复制提取码 “<span style="color: rgb(255, 76, 65);">**keye**</span>” 至 “**<span style="color: rgb(0, 209, 0);">请输入提取码，不区分大小写</span>**” 的文本框，点击 “**<span style="color: rgb(0, 252, 255);">提取文件</span>**” 进入Mixly软件下载页面，左键单击“mixly2.0”。根据计算机系统选择下载对应的版本，Windows系统一般是下载“**mixly2.0-win32-x64-rc4完整版.zip**”版本，如下图所示。

![Img](./media/img-20241023112601.png)

<span style="color: rgb(255, 76, 65);">Mixly For Windows：</span>

![Img](./media/img-20241023112610.png)

<span style="color: rgb(255, 76, 65);">Mixly For Mac(根据系统选择)：</span>

![Img](./media/img-20241023112618.png)

### 6.2.2 安装软件

**1. Windows版本安装：**

下载mixly2.0-win32-x64-rc4完整版压缩包之后，重新命名为mixly2.0 ，右键解压到本地磁盘。

<span style="color: rgb(255, 76, 65);">**特别提醒**：</span>
<br>
<span style="color: rgb(255, 76, 65);">(1)建议解压到硬盘根目录，路径不能包含中文及特殊字符(如:._( )等)。</span>
<br>
<span style="color: rgb(255, 76, 65);">(2)建议安装路径如D:mixly2.0</span> 


因为Mixly是一个绿色免安装软件，所以“**mixly2.0-win32-x64-rc4完整版**”版本在解压之后就可以直接使用了。如果是下载“**一键更新版.7z**”版本的压缩包，压缩包解压后，需要左键双击打开“一键更新.bat”按照提示更新Mixly。

完整的Mixly文件夹中的内容如下图所示：

![Img](./media/img-20241023112829.png)

启动软件：

这里双击“**Mixly.exe**”就能打开Mixly软件。如下图所示：

![Img](./media/img-20241023112918.png)

打开Mixly软件后，找到并且单击“ **<span style="color: rgb(255, 76, 65);">Arduino ESP32</span>** ”就可以进入Mixly编程界面。软件界面如下图所示：

![Img](./media/img-20241023114012.png)

**2. Mac版本安装**：

这里有MAC安装Mixly2.0.txt文件说明。

![Img](./media/img-20241023112956.png)


### 6.2.3 页面介绍

![Img](./media/img-20241023114523.png)

![Img](./media/img-20241023131427.png)

总体来说，Mixly软件界面分为4部分。

1.界面左侧为模块区，这里包含了Mixly中所有能用到的程序模块，根据功能的不同，大概分为以下几类:“输入/输出”、“控制”、“数学”、“逻辑”、“文本”、“数组”、“变量”、“函数”、“串口”、“传感器”、“执行器”、“显示器”、“通信”、“存储”、“网络”。每种类型的模块都用不同的颜色块表示，其中每一个分类中的模块会在附录A中有专门的介绍。

2.模块区的右侧是程序构建区，模块区的模块可通过鼠标拖拽放到程序构建区，拖诟过来的模块会在这里组合成一段有一定逻辑关系的程序块。这个区域有点类似代码程序编辑软件中写代码的地方，在这个区域的右下角有一个垃圾桶，当我们删除模块时，就要将模块拖到垃圾桶中，在垃圾桶的上方有三个圆形的按钮，能够实现程序构建区的放大、缩小以及居中。

3.模块区和程序构建区的上方是基本功能区，类似一般软件的菜单区。这里不仅包含了“新建”、“打开”、“保存”、“另存为”、“导出库”和“管理库”软件都具有的按钮，还包含了硬件编程软件中需要用到的“编译”、“上传”、“控制板选择”、“串口端口”、“串口”这样的按钮。

4.界面的最下方是提示区，这里在软件编译、上传的过程中会显示相应的提示信息。我们可以通过提示信息来解决编译上传过程中出现的一些问题。

<span style="background: rgb(255, 251, 0);">最后还要补充两点：</span><span style="background: rgb(255, 251, 0);"></span>

第一点是 Mixly支持多国语言，我们可以通过如下界面找到并且点击 ![Img](./media/img-20241023132214.png) 进入个性化设置页面，找到语言下面的简体中文下拉菜单，选择不同的语言版本，此时这个下拉菜单显示的是简体中文，如下图所示：

![Img](./media/img-20241023132225.png)

![Img](./media/img-20241023132232.png)

第二点是在界面最上方右侧有一个 ![Img](./media/img-20241023132245.png) 按钮，单击这个按钮就能进入纯代码形式，如下图所示：

![Img](./media/img-20241023132435.png)

Mixly作为一款将图形化编程方式和代码编程方式融合在一起的开发环境，如果只能单独地显示代码或显示图形程序块，那么肯定是不够好的。在Mixly中是能够将代码和图形程序块一起呈现在屏幕上的，这个功能可以通过界面最上方右侧有一个按钮实现，单击这个 ![Img](./media/img-20241023132310.png) 按钮之后，如下图所示：

![Img](./media/img-20241023132515.png)

这时，在程序构建区的右侧会显示出对应的代码，这段代码是与程序构建区中的模块所组成的程序块对应的，会随着模块的变化而变化，不过区域中的代码是不可编辑的。同时，界面最右侧那个向左的箭头按钮变成了向右的箭头。

**<span style="color: rgb(255, 76, 65);">注意：想了解更多关于Mixly相关知识的请点击链接：</span>**[https://mixly.readthedocs.io/zh-cn/latest/](https://mixly.readthedocs.io/zh-cn/latest/) 。

### 6.2.4 添加Mixly库文件

<span style="color: rgb(255, 76, 65);">注意：Mixly库文件( index 库)必须添加好，否则后面涉及到相关模块的示例代码是打不开的</span>。
<br>
<span style="color: rgb(0, 209, 0); background: rgb(255, 251, 0);">特别提醒：库文件在上面 **<span style="color: rgb(255, 76, 65);">资料下载</span>** 处提供有，请下载并且安装好库文件。</span>
<br>

Mixly软件下载安装后，点击 <span style="color: rgb(255, 76, 65);">Arduino ESP32</span> 进入代码编辑器，先点击右上角“ 设置 ”，再点击“ 管理库 ”进入添加库文件界面。如下图所示：

![Img](./media/img-20241023114012.png)

![Img](./media/img-20241023132829.png)

先点击“ 导入库 ”，再点击 ![Img](./media/img-20241023132850.png) 进入库文件所放的位置，找到 **<span style="color: rgb(255, 76, 65);">index.xml</span>** 库文件并选中它，然后单击“ 确定 ”。之后，就可以看到库文件在导入中，一会儿会出现“ 导入成功 ”字样，说明库文件导入成功。如下图所示：

![Img](./media/img-20241031081028.png)

![Img](./media/img-20241031081529.png)

![Img](./media/img-20241031081700.png)


点击“管理库”，可以看到添加成功的库文件。如下图所示：

![Img](./media/img-20241031081748.png)

关闭添加库文件的窗口界面，在代码编辑器左侧看到所添加的库文件。如下图所示：

![Img](./media/img-20241031081837.png)

### 6.2.5 编写代码并上传至 ESP32 主控板 

（**<span style="color: rgb(255, 76, 65);">后面上传项目代码的步骤也一样，即：同下</span>。**）

确保ESP32主控板与计算机连接成功，然后双击“ **Mixly.exe** ”图标打开Mixly软件。

方法①：从直接拖动代码块到程序构建区进行代码编写，选用管脚IO15，如下图所示：

![Img](./media/img-20241023133629.png)

编写完成后保存到电脑上，单击“ 文件 ”-->“ 另存为 ”，如下图所示：

![Img](./media/img-20241023133737.png)

选择ESP32主控板的板型 “<span style="color: rgb(255, 0, 0);">ESP32 Dev Moduel</span>” 和串口端口（COM6）（<span style="color: rgb(255, 76, 65); background: rgb(255, 251, 0);">提示：不同的电脑，串口端口是不一样的</span><span style="background: rgb(255, 251, 0);"></span>），(<span style="color: rgb(255, 76, 65);">注意：</span>将ESP32主板通过USB线连接到计算机后才能看到对应的端口。)，如下图所示：

![Img](./media/img-20241023134451.png)

![Img](./media/img-20241023134429.png)

单击 ![Img](./media/img-20241023135146.png)将代码上传到ESP32主控板，如下图所示：

![Img](./media/img-20241023134529.png)

方法②：从电脑打开已经编写好的代码  

将我们提供的代码文件压缩包解压，把解压后的代码文件夹保存到方便使用的位置。

“ 文件 ”-->“ 打开 ”，然后选择保存代码的路径，选中代码文件打开即可。如下图所示：

![Img](./media/img-20241023134712.png)

![Img](./media/img-20241023135106.png)

代码文件打开后，需要手动选择ESP32主控板的板型 “<span style="color: rgb(255, 0, 0);">ESP32 Dev Moduel</span>” 和串口端口（COM6）（<span style="color: rgb(255, 76, 65); background: rgb(255, 251, 0);">提示：不同的电脑，串口端口是不一样的</span><span style="background: rgb(255, 251, 0);"></span>），(<span style="color: rgb(255, 76, 65);">注意：</span>将ESP32主板通过USB线连接到计算机后才能看到对应的端口。)，如下图所示：

![Img](./media/img-20241023134451.png)

![Img](./media/img-20241023134429.png)

单击![Img](./media/img-20241023135157.png)将代码上传到ESP32主控板，如下图所示：

![Img](./media/img-20241023134529.png)

---

## 6.3 项目教程

---

### 第一课 Hello World

1.1 项目介绍

对于ESP32的初学者，先从一些简单的开始学习吧！在这个项目中，你只需要一个ESP32主板，USB线和计算机就可以完成“Hello World!”项目。它不仅是ESP32主板和计算机的通信测试，也是ESP32的初级项目。这也是一个入门实验，让你进入计算机的编程世界。

---

1.2 实验组件

| ![img](./media/KS5016.png) | ![img](./media/USB.jpg) |
| :----------------------: | :-------------------: |
|    ESP32 Plus主板 x1     |       USB线 x1        |

---

1.3 实验接线图

![011301](./media/011301.png)

---

1.4 代码说明

![Img](./media/img-20241023140243.png)

设置串口波特率，一般是设置为9600。

![Img](./media/img-20241023140328.png)

自动换行输出数据。从串行端口输出数据，跟随一个回车和一个换行符。

![Img](./media/img-20241101093914.png)

从串行端口不换行输出数据。

![Img](./media/img-20241023140625.png)

将程序的执行暂停一段时间，也就是延时。单位是毫秒。

---

1.5 实验代码

本项目中使用的代码保存在文件夹“<u>**..\Mixly\Mixly_代码**</u>”中 （**<span style="color: rgb(255, 76, 65);">后面的项目代码保存的路径也一样，即：同下</span>。**），你也可以自己编写代码，其如下：

1. 从 “![Img](./media/img-20241023140031.png)” 拖出 “![Img](./media/img-20241023140106.png)”。

2. 从 “![Img](./media/img-20241023140218.png)” 拖出 “![Img](./media/img-20241023140243.png)” 放入 “![Img](./media/img-20241023140106.png)”。

3. 从 “![Img](./media/img-20241023140218.png)” 拖出 “![Img](./media/img-20241023140328.png)”。

4. 从 “![Img](./media/img-20241023140400.png)” 拖出 “![Img](./media/img-20241023140426.png)” 放入 “![Img](./media/img-20241023140328.png)”，将 <span style="color: rgb(255, 76, 65);">hello</span> 修改为 <span style="color: rgb(255, 76, 65);">Hello World</span>。

5. 从 “![Img](./media/img-20241023140031.png)” 拖出 “![Img](./media/img-20241023140625.png)”。

完整代码：

![Img](./media/img-20241023140731.png)


在上传项目代码到ESP32之前，需要手动选择Arduino ESP32主控板的板型 “<span style="color: rgb(255, 0, 0);">ESP32 Dev Moduel</span>” 和串口端口（COM6）（<span style="color: rgb(255, 76, 65); background: rgb(255, 251, 0);">提示：不同的电脑，串口端口是不一样的</span><span style="background: rgb(255, 251, 0);"></span>）。(<span style="color: rgb(255, 76, 65);">注意：</span>将ESP32主板通过USB线连接到计算机后才能看到对应的端口。) （**<span style="color: rgb(255, 76, 65);">后面上传项目代码的步骤也一样，即：同下</span>。**）

![Img](./media/img-20241023141133.png)

![Img](./media/img-20241023141156.png)

单击 ![Img](./media/img-20241023135146.png) 将项目代码上传到ESP32主板上。(<span style="color: rgb(255, 76, 65);">**下同**</span>)

![Img](./media/img-20241023141718.png)


项目代码上传成功！

![Img](./media/img-20241023142033.png)

---

1.6 实验结果

项目代码上传成功后，利用USB线上电，单击图标![Img](./media/img-20241023142105.png)进入串行监视器，设置波特率为9600，这样串口监视器打印“Hello World!”。

![Img](./media/img-20241023142219.png)

![Img](./media/img-20241023142346.png)

![Img](./media/img-20241023142423.png)

---

### 第二课 LED

1.1 项目介绍

LED，即发光二极管的简称。由含镓（Ga）、砷（As）、磷（P）、氮（N）等的[化合物](https://baike.baidu.com/item/化合物/1142931)制成。当电子与[空穴](https://baike.baidu.com/item/空穴/3517781)复合时能辐射出可见光，因而可以用来制成发光二极管。在电路及仪器中作为指示灯，或者组成文字或数字显示。砷化镓二极管发红光，磷化镓二极管发绿光，碳化硅二极管发黄光，氮化镓二极管发蓝光。因化学性质又分有机发光二极管OLED和无机发光二极管LED。

为了实验的方便，我们将紫色LED发光二极管做成了一个紫色LED模块。它的控制方法非常简单，只要让LED两端有一定的电压就可以点亮LED。在这个项目中，我们用一个最基本的测试代码来控制LED，亮一秒钟，灭一秒钟，来实现闪烁的效果。你可以改变代码中LED灯亮灭的时间，实现不同的闪烁效果。我们通过编程控制信号端S的高低电平，从而控制LED的亮灭。LED模块信号端S为高电平时LED亮起，S为低电平时LED熄灭。

---

1.2 模块参数

工作电压：DC 3.3-5V

控制信号：数字信号

尺寸：32 x 23.5 x 12 mm

定位孔大小：直径为 4.8 mm

接口：间距为2.54 mm 3pin防反接口

---

1.3 模块原理图

![img](./media/021301.jpg)

这是一个常用的LED模块，它采用F5-白发紫LED（外观白色，显示紫光）元件。同时，模块上自带一个间距为 2.54mm 的 3pin 防反插红色端子。控制时，模块上GND VCC供电后，信号端S为高电平时，模块上LED亮起。

模块兼容各种单片机控制板，如arduino系列单片机。   

---

1.4 实验组件

| ![img](./media/KS5016.png) | ![img](./media/KE4001.png) | ![img](./media/3pin.jpg)       | ![img](./media/USB.jpg) |
| ------------------------ | ------------------------ | ---------------------------- | --------------------- |
| ESP32 Plus主板 x1        | Keyes 紫色LED模块 x1     | XH2.54-3P 转杜邦线母单线  x1 | USB线 x1              |

---

1.5 模块接线图

![021501](./media/021501.png)

---

1.6 代码说明

![Img](./media/img-20241029163343.png)

向指定管脚设置“高”或“低”，选择“高”代表给该管脚设置高电平，有电压，有电流，则LED点亮；选择“低”代表给管脚设置低电平，没电压，没有电流，则LED不亮。

---

1.7 实验代码

本项目中使用的代码保存在文件夹“<u>**..\Mixly\Mixly_代码**</u>”中 （**<span style="color: rgb(255, 76, 65);">后面的项目代码保存的路径也一样，即：同下</span>。**），你也可以自己编写代码，其如下：

1. 从 “![Img](./media/img-20241023140031.png)” 拖出 “![Img](./media/img-20241023140106.png)”。

2. 从 “![Img](./media/img-20241024131848.png)” 拖出 “ ![Img](./media/img-20241029163433.png) ” 放入 “![Img](./media/img-20241023140106.png)”，管脚为 5 ，设为 “低” 。

3. 从 “![Img](./media/img-20241024131848.png)” 拖出 “ ![Img](./media/img-20241029163433.png) ” ，管脚为 5 ，设为 “高” 。

4. 从 “![Img](./media/img-20241023140031.png)” 拖出 “![Img](./media/img-20241023140625.png)”，设置延时为500毫秒。

5. 复制代码块 “![Img](./media/img-20241029163924.png) ” 1 次，将 “高” 改为 “低”。

完整代码：

![Img](./media/img-20241029163959.png)

在上传项目代码到ESP32之前，需要手动选择Arduino ESP32主控板的板型 “<span style="color: rgb(255, 0, 0);">ESP32 Dev Moduel</span>” 和串口端口（COM6）（<span style="color: rgb(255, 76, 65); background: rgb(255, 251, 0);">提示：不同的电脑，串口端口是不一样的</span><span style="background: rgb(255, 251, 0);"></span>）。(<span style="color: rgb(255, 76, 65);">注意：</span>将ESP32主板通过USB线连接到计算机后才能看到对应的端口。) （**<span style="color: rgb(255, 76, 65);">后面上传项目代码的步骤也一样，即：同下</span>。**）

![Img](./media/img-20241113152219.png)

![Img](./media/img-20241113152250.png)


单击 ![Img](./media/img-20241023135146.png) 将项目代码上传到ESP32主板上。(<span style="color: rgb(255, 76, 65);">**下同**</span>)

![Img](./media/img-20241113152411.png)


项目代码上传成功！

![Img](./media/img-20241113152457.png)

---

1.8 实验结果

按照接线图正确接好模块后再上传代码，上传成功后，给主控板供电，你会看到模块上的紫色LED一亮一灭，循环闪烁。

![img](./media/021701.png)

![img](./media/021702.png)

 
---

### 第三课 交通灯模块

1.1 项目介绍

交通灯，也就是马路上十字路口的红绿灯，在我们的日常生活中很常见。交通灯是由红、黄、绿三种颜色组成的，根据一定的时间规律循环交替亮起或熄灭。每个人都应该遵守交通规则，这可以避免许多交通事故。

想学习交通灯的原理吗？我们可以用红、黄、绿3个LED外接电路来模拟马路上的交通灯。因此我们特别设计了这款交通灯模块，模块上的红、黄、绿3个LED灯模拟交通灯。

---

1.2 模块参数

工作电压 : DC 5V 

电流 ：100 mA

最大功率 ：0.5 W

工作温度 ：-10°C ~ +50°C

输入信号 : 数字信号

尺寸 ：47.6 x 23.8 x 11.8 mm

定位孔大小：直径为 4.8 mm

接口 ：间距为2.54 mm 5pin防反接口

---

1.3 模块原理图

![031301](./media/031301.png)

上一课我们学习了如何控制一个LED，由原理图可以得知，控制这个模块就好比分别控制3个独立的LED灯(我们这个灯可直接由单片机IO口驱动)，给对应颜色灯高电平就亮起对应的颜色。比如，我们给信号“R”输出高电平，也就是3.3V，则红色LED点亮。

---

1.4 实验组件

| ![img](./media/KS5016.png) | ![img](./media/KE4008.png) | ![img](./media/5pin.jpg)       | ![img](./media/USB.jpg) |
| ------------------------ | ------------------------ | ---------------------------- | --------------------- |
| ESP32 Plus主板 x1        | Keyes 交通灯模块 x1      | XH2.54-5P 转杜邦线母单线  x1 | USB线  x1             |

---

1.5 模块接线图

![img](./media/031501.jpg)

---

1.6 实验代码

本项目中使用的代码保存在文件夹“<u>**..\Mixly\Mixly_代码**</u>”中 （**<span style="color: rgb(255, 76, 65);">后面的项目代码保存的路径也一样，即：同下</span>。**），你也可以自己编写代码，其如下：

1. 从 “![Img](./media/img-20241023140031.png)” 拖出 “![Img](./media/img-20241023140106.png)”。

2. 从 “![Img](./media/img-20241024131848.png)” 分别拖出 “ ![Img](./media/img-20241029171029.png) ” 、 “ ![Img](./media/img-20241029171054.png) ” 、 “ ![Img](./media/img-20241029171118.png) ” 放入 “![Img](./media/img-20241023140106.png)”，红色LED管脚为 5 、黄色LED管脚为 13 、绿色LED管脚为 12 ，全部设为 “低”。

![Img](./media/img-20241029171409.png)

3. 复制代码块 “ ![Img](./media/img-20241029171205.png) ” 1 次，将红色LED设为 “高”；又从 “![Img](./media/img-20241023140031.png)” 拖出 “![Img](./media/img-20241023140625.png)”，设置延时为5000毫秒；再复制复制代码块 “ ![Img](./media/img-20241029171205.png) ” 1次，延时为500毫秒。

![Img](./media/img-20241029171344.png)

4. 从 “![Img](./media/img-20241023140031.png)” 拖出 “ ![Img](./media/img-20241029165415.png) ” ，从 1 到 10 步长为 1 改成从 1 到 3 步长为 1。

5. 复制代码块 “ ![Img](./media/img-20241029171728.png) ” 1 次 放入 “ ![Img](./media/img-20241029171832.png) ”，将黄色LED设为 “低” 改成设为 “高”，再复制代码块 “ ![Img](./media/img-20241029171728.png) ” 1 次放入 “ ![Img](./media/img-20241029171839.png) ” ，

![Img](./media/img-20241029171941.png)

6. 复制代码块 “ ![Img](./media/img-20241029172025.png) ” 1次，将红色LED设为 “高” 改成 “低” ，再把绿色LED设为 “低” 改成设为 “高”。

![Img](./media/img-20241029172101.png)

7. 复制代码块 “ ![Img](./media/img-20241029171728.png) ” 1次。

完整代码：

![Img](./media/img-20241113154626.png)

---

1.7 实验结果

按照接线图正确接好模块后再上传代码，上传成功后，给主控板供电，你会看到模块上绿色LED亮5秒然后熄灭，黄色LED闪烁3秒然后熄灭，红色LED亮5秒然后熄灭。模块按此顺序循环亮灭。

---

### 第四课 呼吸灯

1.1 项目介绍

在第二课我们学习了如何让LED闪烁。但是LED的玩法远不仅如此。在日常生活中你有没有遇到过灯光慢慢变亮或者慢慢变暗呢？这叫呼吸灯。所谓呼吸灯，就是控制LED逐渐变亮，然后逐渐变暗，循环交替。上一课我们学会了直接用高电平点亮LED，低电平熄灭LED。如果要让LED不那么亮但又不完全熄灭，介于中间状态，只需控制流过LED的电流就可以实现。电流减小LED变暗，电流增大LED变亮。所以只需要调节LED两端的电压减小或增大（电流也会随之减小或增大）就能控制LED的亮暗程度了。

数字端口电压输出只有LOW与HIGH两个开关，对应的就是0V与3.3V（或5V）的电压输出。可以把LOW定义为0，HIGH定义为1，1秒内让单片机输出500个0或者1的信号。如果这500个信号全部为1，那就是完整的3.3V；如果全部为0，那就是0V。如果010101010101这样输出，刚好一半，端口输出的平均电压就为1.65V了。这和放映电影是一个道理。我们所看的电影并不是完全连续的，它其实是每秒输出25张图片，人的肉眼分辨不出来，看上去就是连续的了，PWM也是同样的道理。如果想要不同的电压，就控制0与1的输出比例就可以了。当然这和真实的连续输出还是有差别的，单位时间内输出的0,1信号越多，控制的就越精确。

那么什么是PWM呢？PWM简称脉宽调制，是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。

![img](./media/061101.jpg)

PWM的频率是指在1秒钟内，信号从高电平到低电平再回到高电平的次数，也就是说一秒钟PWM有多少个周期，单位Hz。

PWM的周期，T=1/f，T是周期，f是频率。如果频率为50Hz ，也就是说一个周期是20ms，那么一秒钟就有 50次PWM周期。

占空比，是一个脉冲周期内，高电平的时间与整个周期时间的比例，单位是% (0%-100%)  一个周期的长度。如下图所示。

![img](./media/061102.jpg)

这一课学习使用PWM来控制0与1的输出比例实现控制电压。

---

1.2 模块参数

工作电压 : DC 3.3 ~ 5V 

工作温度 ：-10°C ~ +50°C

控制信号 : 数字信号

尺寸 ：32 x 23.8 x 12 mm

定位孔大小：直径为 4.8 mm

接口 ：间距为2.54 mm 3pin防反接口

---

1.3 模块原理图

![img](./media/021301.jpg)

前面实验二我们就学习了如何控制一个LED，由原理图可以得知，控制时，模块上GND VCC供电后，信号端S为高电平时，模块上LED亮起。

---

1.4 实验组件

| ![img](./media/KS5016.png) | ![img](./media/KE4001.png) | ![img](./media/3pin.jpg)       | ![img](./media/USB.jpg) |
| ------------------------ | ------------------------ | ---------------------------- | --------------------- |
| ESP32 Plus主板 x1        | Keyes 紫色LED模块 x1     | XH2.54-3P 转杜邦线母单线  x1 | USB线  x1             |

---

1.5 模块接线图

![img](./media/021501.png)

---

1.6 代码说明 

![Img](./media/img-20241029165007.png)

向指定管脚设置通道，赋值可以为0 ~ 255。

![Img](./media/img-20241029164725.png)

将数字管脚 5 的通道设置为CH0(LT0)，赋值为0 ，是LED熄灭。

![Img](./media/img-20241029165054.png)

将管脚 5 的通道设置为CH0(LT0)，赋值为i。

![Img](./media/img-20241029165146.png)

设置一个变量 i ，i从 0 逐渐增加到 255，每一次都加 5，总共加了 51 次， 每次以10毫秒的频率增加 5，LED逐渐变亮。

![Img](./media/img-20241029165211.png)

设置一个变量i，i从 255 逐渐减少到 0，每一次都减5，总共减了51次， 每次以 10 毫秒的频率减 5，LED逐渐变暗。

---

1.7 实验代码

本项目中使用的代码保存在文件夹“<u>**..\Mixly\Mixly_代码**</u>”中 （**<span style="color: rgb(255, 76, 65);">后面的项目代码保存的路径也一样，即：同下</span>。**），你也可以自己编写代码，其如下：

1. 从 “![Img](./media/img-20241023140031.png)” 拖出 “![Img](./media/img-20241023140106.png)”。

2. 从 “![Img](./media/img-20241024131848.png)” 拖出 “ ![Img](./media/img-20241029165252.png) ” 放入 “![Img](./media/img-20241023140106.png)”，管脚为 5 ，通道设置为CH0(LT0)，赋值为 0。

3. 从 “![Img](./media/img-20241023140031.png)” 拖出 “ ![Img](./media/img-20241029165415.png) ” ，从 1 到 10 步长为 1 改成从 0 到 255 步长为 5。

4. 从 “![Img](./media/img-20241024131848.png)” 拖出 “ ![Img](./media/img-20241029165252.png) ” 放入 “ ![Img](./media/img-20241029165529.png) ”，管脚为 5 ，通道设置为CH0(LT0)；又从 “ ![Img](./media/img-20241024133608.png)” 拖出 “![Img](./media/img-20241024133651.png) ” 放入赋值为 0 处。

5. 从 “![Img](./media/img-20241023140031.png)” 拖出 “![Img](./media/img-20241023140625.png)” 放入 “ ![Img](./media/img-20241029165529.png) ”，设置延时为10毫秒。

6. 复代码块 “ ![Img](./media/img-20241029165711.png) ” 1 次，从 0 到 255 步长为 5 改成从 255 到 0 步长为 -5。

完整代码：

![Img](./media/img-20241113161102.png)

---

1.8 实验结果

按照接线图正确接好模块后再上传代码，上传成功后，给主控板供电，能看到模块上的紫色LED从暗逐渐变亮，再从亮逐渐变暗，就像呼吸一样。

---

### 第五课 RGB模块调节LED颜色

1.1 项目介绍


在这个套件中，有一个Keyes 共阴RGB模块，它采用F10-全彩RGB雾状共阴LED元件。控制时，我们需要将模块的R、G、B脚连接至单片机的PWM口。由于我们这个RGB模块是共阴的，公共管脚就接GND（共阳RGB公共管脚接VCC)。   

RGB三色也就是三基色，红色、绿色、蓝色。人眼对RGB三色最为敏感，大多数的颜色可以通过RGB三色按照不同的比例合成产生。同样绝大多数单色光也可以分解成RGB三种色光。这是色度学的最基本原理，即三基色原理。RGB三基色按照不同的比例相加合成混色称为相加混色，除了相加混色法之外还有相减混色法。可根据需要相加相减调配颜色。

接下来，我们基于刚刚学习的三基色原理，通过PWM端口控制R、G、B各色的占空比，使R、G、B三色按照不同的比例合成产生多重颜色显示在LED上。

---

1.2 模块参数

工作电压 ：DC 3.3 ~ 5V

工作温度 ：-10°C ~ +50°C

输入信号 ：PWM信号

尺寸 ：32 x 23.8 x 16.9 mm

定位孔大小 ：直径为 4.8 mm

接口 ：间距为2.54 mm 4pin防反接口

---

1.3 模块原理图

![img](./media/061301.png)

通过调节R、G、B、三个灯的PWM值，控制LED元件显示红光、绿光和蓝光的比例，从而控制RGB模块上LED显示不同颜色灯光。当设置的PWM值越大，对应显示的颜色比例越重。理论上来说，通过调节这3中颜色光的混合比例，可以模拟出所有颜色的灯光。

---

1.4 实验组件

| ![img](./media/KS5016.png) | ![img](./media/KE4074.png) | ![img](./media/4pin.jpg)          | ![img](./media/USB.jpg) |
| --------------------- | --------------------- | ---------------------------- | ------------------ |
| ESP32 Plus主板 x1     | Keyes 共阴RGB模块 x1  | XH2.54-4P 转杜邦线母单线  x1 | USB线  x1          |

---

1.5 模块接线图

![img](./media/061501.png)

---

1.6 代码说明

![Img](./media/img-20241101084925.png)

设置共阴RGB亮不同颜色光，R、G、B可以在 0 ~ 255 之间设置任何数字。

---

1.7 实验代码

你可以打开我们提供的代码，也可以自己编写代码，其如下：

1. 从 “![Img](./media/img-20241023140031.png)” 拖出 “![Img](./media/img-20241023140106.png)”。

2. 从 “![Img](./media/img-20241024131848.png)” 拖出 “ ![Img](./media/img-20241101090120.png) ” 放入 “![Img](./media/img-20241023140106.png)”，R 管脚 为 32 、G 管脚 为 4 、B 管脚 为 2 ，R 、G、B 的值都赋值为 0 。

![Img](./media/img-20241101091350.png)

3. 从 “![Img](./media/img-20241023140031.png)” 拖出 “ ![Img](./media/img-20241029165415.png) ” ，从 1 到 10 步长为 1 改成从 0 到 255 步长为 1。

4. 复制代码块 “ ![Img](./media/img-20241113162646.png) ” 1 次放入 “ ![Img](./media/img-20241029174446.png) ” ，又从 “ ![Img](./media/img-20241024133608.png)” 拖出 “![Img](./media/img-20241024133651.png) ” 放入 R（0 ~ 255）后面 0 处；再从 “ ![Img](./media/img-20241024143857.png) ” 拖出 “ ![Img](./media/img-20241029174654.png) 放入 G（0 ~ 255）后面 0 处，将 “ + ” 改成 “ - ” ，把“ - ”前面的 1 改成 128，“ - ”后面的 1 替换成变量 i ；再复制代码块 “ ![Img](./media/img-20241029174845.png) ” 放入 G（0~255）后面 0 处，将 128 改成 255 ；再延时 10 毫秒。

![Img](./media/img-20241029175036.png)

5. 复制代码块 “ ![Img](./media/img-20241029175119.png) ” 1 次，将 从 0 到 255 步长为 1 改成 从 255 到 0 步长为 -1 。

![Img](./media/img-20241101092739.png)

完整代码：

![Img](./media/img-20241113163146.png)

---

1.8 实验结果

按照接线图正确接好模块后再上传代码，上传成功后，给主控板供电，能看到模块上RGB LED开始随机显示颜色。

![img](./media/061701.png)

![img](./media/061702.png)

---


### 第六课 按键传感器检测实验

1.1 项目介绍

在这个套件中，有一个Keyes单路按键模块，它主要由1个轻触开关组成，自带1个黄色按键帽。第二课我们学习了怎么让单片机的引脚输出一个高电平或者低电平，这节课程我们就来学习怎么读取引脚的电平。

按键模块的按键按下，单片机读取到低电平，松开按键读取到高电平。通过读取传感器上S端的高低电平，判断按键是否按下，并且在串口监视器上显示测试结果。

---

1.2 模块参数

工作电压 : DC 3.3 ~ 5V 

工作温度 ：-10°C ~ +50°C

控制信号 : 数字信号

尺寸 ：32 x 23.8 x 15.6 mm

定位孔大小：直径为 4.8 mm

接口 ：间距为2.54 mm 3pin防反接口

---

1.3 模块原理图

![img](./media/071301.png)

按键有四个引脚，其中1与3相连，2与4相连。按键未被按下时，13与24是断开的。信号端S读取的电平是被4.7K的上拉电阻R1所拉高的高电平。而当按键被按下时，13和24连通，原本上拉的13脚被24脚接的GND下拉至低电平，此时信号端S读取到低电平。即按下按键，传感器信号端S为低电平；松开按键时，信号端S为高电平。

---

1.4 实验组件

| ![img](./media/KS5016.png) | ![img](./media/KE4012.png) | ![img](./media/3pin.jpg)       | ![img](./media/USB.jpg) |
| ------------------------ | ------------------------ | ---------------------------- | --------------------- |
| ESP32 Plus主板 x1        | Keyes 单路按键模块 x1    | XH2.54-3P 转杜邦线母单线  x1 | USB线  x1             |

---

1.5 模块接线图

![img](./media/071501.png)

---

1.6 代码说明

![Img](./media/img-20241029162852.png)

从指定的数字管脚读取按键开关的数字信号(高/低电平)。

![Img](./media/img-20241113171600.png)

如果（ ）里的表达式为真，则运行 "执行" 块内的代码。如果（ ）里表达式为假 ，则运行 "否则" 块内的代码。 

---

1.7 实验代码

你可以打开我们提供的代码，也可以自己编写代码，其如下：

1. 从 “![Img](./media/img-20241023140031.png)” 拖出 “![Img](./media/img-20241023140106.png)”。

2. 从 “![Img](./media/img-20241023140218.png)” 拖出 “![Img](./media/img-20241023140243.png)” 放入 “![Img](./media/img-20241023140106.png)”。

3. 先从 “ ![Img](./media/img-20241024133608.png)” 拖出 “![Img](./media/img-20241028131724.png)” 放入 “![Img](./media/img-20241023140106.png)” 中；再从 “![Img](./media/img-20241024143857.png)” 拖出 “![Img](./media/img-20241028132058.png)” 放入 “![Img](./media/img-20241028131724.png)”中，将 “item” 改成 “switch_state” 。

![Img](./media/img-20241030141614.png)

4. 先从 “![Img](./media/img-20241024133608.png)” 拖出 “![Img](./media/img-20241030141123.png)” ，再从 “![Img](./media/img-20241029163044.png)” 拖出 “ ![Img](./media/img-20241113165040.png) ” ，管脚为 5 。

![Img](./media/img-20241030141846.png)

5. 先从 “![Img](./media/img-20241023140218.png)” 拖出 “ ![Img](./media/img-20241030141723.png) ”，将 “自动换行” 改成 “不换行” ；再从 “ ![Img](./media/img-20241024133608.png)” 拖出 “![Img](./media/img-20241030141816.png) ” 。

![Img](./media/img-20241030141906.png)

6. 先从 “![Img](./media/img-20241023140031.png)” 拖出 “![Img](./media/img-20241028135641.png)” 点击 ![Img](./media/img-20241113165644.png) 进去将 “![Img](./media/img-20241113165735.png)” 移进 “![Img](./media/img-20241113165824.png)” 中，再点击 ![Img](./media/img-20241113165644.png) ；接着从 “![Img](./media/img-20241028132537.png)” 拖出 “![Img](./media/img-20241028135823.png)” 放入 “![Img](./media/img-20241028135641.png)” 中；再从 “ ![Img](./media/img-20241024133608.png)” 拖出 “![Img](./media/img-20241030141816.png) ”  放入 “ = ” 左侧 ；最后从 “![Img](./media/img-20241028132016.png)” 拖出 “![Img](./media/img-20241028132058.png)” 放入 “ = ” 右侧。

![Img](./media/img-20241030142059.png)

7. 先从 “![Img](./media/img-20241023140218.png)” 拖出 “![Img](./media/img-20241029151254.png)” 放入 “![Img](./media/img-20241113170215.png)”的 <span style="color: rgb(255, 76, 65);">执行</span> 处 ，将 “自动换行” 改成 “不换行” ；接着从 “ ![Img](./media/img-20241029152415.png) ” 拖出 “ ![Img](./media/img-20241029152450.png) ”，将 hello 变成 2 个空格；复制代码块 “![Img](./media/img-20241113170352.png)” 1次，将 “不换行” 改成 “自动换行” ，空格改成 “Press the botton” ；添加延时 100 毫秒。

![Img](./media/img-20241113170607.png)

8. 复制代码块 “![Img](./media/img-20241113170657.png)” 1 次 放入 <span style="color: rgb(255, 76, 65);">否则</span> 处 ，将 “Press the botton” 改成 “Loosen the botton” 。

![Img](./media/img-20241113170917.png)

完整代码：

![Img](./media/img-20241113171037.png)

---

1.8 实验结果

按照接线图正确接好模块后再上传代码，上传成功后，给主控板供电，打开串口监视器，设置波特率为 **<u>9600</u>** 。

当按下传感器模块上的按键时，按键值value为0，串口监视器打印出“**0     Press the button**”；松开按键时，按键值value为1，串口监视器打印出“**1     Loosen the button**”字符。

![Img](./media/img-20241113171743.png)

---

### 第七课 避障传感器检测障碍物

1.1 项目介绍

在这个套件中，有一个Keyes 避障传感器，它主要由一对红外线发射与接收管元件组成。实验中，我们通过读取传感器上S端高低电平，判断是否存在障碍物。

---

1.2 模块参数

工作电压 : DC 5V 

电流 : 50 mA

最大功率 : 0.3 W

工作温度 ：-10°C ~ +50°C

输出信号 : 数字信号

感应距离 : 2 ~ 40 cm

尺寸 ：32 x 23.8 x 11 mm

定位孔大小：直径为 4.8 mm

接口 ：间距为2.54 mm 3pin防反接口

---

1.3 模块原理图

![img](./media/091301.jpg)

NE555时基电路提供给发射管TX发射出一定频率的红外信号，红外信号会随着传送距离的加大逐渐衰减，如果遇到障碍物，就会形成红外反射。当检测方向RX遇到反射回来的信号比较弱时，接收检测引脚输出高电平，说明障碍物比较远；当反射回来的信号比较强，接收检测引脚输出低电平，说明障碍物比较近，此时指示灯亮起。传感器上有两个电位器，一个用于调节发送功率，一个用于调节接收频率，通过调节两个电位器，我们可以调节它的有效距离。

---

1.4 实验组件

| ![img](./media/KS5016.png) | ![img](./media/KE4019.png) | ![img](./media/3pin.jpg)       | ![img](./media/USB.jpg) |
| ------------------------ | ------------------------ | ---------------------------- | --------------------- |
| ESP32 Plus主板 x1        | Keyes 避障传感器 x1      | XH2.54-3P 转杜邦线母单线  x1 | USB线  x1             |

---

1.5 模块接线图

![img](./media/091501.png)

---

1.6 代码说明

![Img](./media/img-20241113174322.png)

从指定的数字管脚读取避障传感器的数字信号(高/低电平)。

![Img](./media/img-20241113171600.png)

如果（ ）里的表达式为真，则运行 "执行" 块内的代码。如果（ ）里表达式为假 ，则运行 "否则" 块内的代码。 

---

1.7 实验代码

<span style="color: rgb(255, 76, 65); background: rgb(255, 251, 0);">你可以打开我们提供的代码，也可以自己编写代码，其编写代码的过程可以参考 “**第六课 按键传感器检测实验**”，这里就不重复讲解：</span>

![Img](./media/img-20241113174052.png)

---

1.8 实验结果

按照接线图正确接好模块后再上传代码，上传成功后，给主控板供电，接着开始调节传感器模块上的两个电位器感应距离。避障传感器上有两个电位器，分别是接收频率调节电位器和发射功率调节电位器，如下图所示。

![img](./media/091701.jpg)

先调节发射功率调节电位器，先将电位器顺时针拧到尽头，然后逆时针慢慢往回调，当调节到SLED灯亮起时，微调使传感器上SLED灯介于亮与不亮之间的**不亮**状态。

接着设置接收频率调节电位器，同样将电位器顺时针拧到尽头，然后逆时针慢慢往回调，当SLED灯亮起时，微调使传感器上SLED灯介于亮与不亮之间的**不亮**状态，此时能检测障碍物的距离最长。

打开串口监视器，设置波特率为 **<u>9600</u>**。当传感器检测到障碍物时，value 值为 **0**，SLED 灯亮，串口监视器打印出 “**0    There are obstacles**” ；没有检测到障碍物时，value 值为 **1**，SLED 灯灭，串口监视器打印出 “**1    All going well**” 。

![img](./media/091703.png)

![img](./media/091704.png)

![Img](./media/img-20241113174610.png)
 

---

### 第八课 倾斜模块的原理

1.1 项目介绍

在这个套件中，有一个Keyes 倾斜传感器，主要由一个倾斜开关组成，其内部带有一颗滚珠，用来监测倾斜情况。倾斜开关可以依据模块是否倾斜而输出不同的电平信号。当开关高于水平位置倾斜时开关导通，低于水平位置时开关断开。倾斜模块可用于倾斜检测、报警器制作或者其他检测。

---

1.2 模块参数

工作电压 : DC 3.3 ~ 5V 

电流 : 50 mA

最大功率 : 0.3 W

工作温度 ：-10°C ~ +50°C

输出信号 : 数字信号

尺寸 ：32 x 23.8 x 8 mm

定位孔大小：直径为 4.8 mm

接口 ：间距为2.54 mm 3pin防反接口

---

1.3 模块原理图

![img](./media/121301.png)

Keyes 倾斜传感器的原理非常简单，主要是利用滚珠在开关内随不同倾斜角度的变化使滚珠开关P1的引脚1和2导通或者不导通，当滚珠开关P1的引脚1和2导通时，由于1脚接GND，所以信号端S被拉低为低电平，此时红色LED和R2组成的电路形成回路，电流经过红色LED，点亮红色LED；当滚珠开关P1的引脚1和2不导通时，滚珠开关P1的引脚2被4.7K的上拉电阻R1拉高使得信号端S为高电平，电流不经过红色LED，红色LED熄灭。


---

1.4 实验组件

| ![img](./media/KS5016.png) | ![img](./media/KE4017.png) | ![img](./media/3pin.jpg)       | ![img](./media/USB.jpg) |
| ------------------------ | ------------------------ | ---------------------------- | --------------------- |
| ESP32 Plus主板 x1        | Keyes 倾斜传感器 x1      | XH2.54-3P 转杜邦线母单线  x1 | USB线  x1             |

---

1.5 模块接线图

![img](./media/121501.png)

---

1.6 代码说明

![Img](./media/img-20241114090554.png)

从指定的数字管脚读取倾斜传感器的数字信号(高/低电平)。

![Img](./media/img-20241113171600.png)

如果（ ）里的表达式为真，则运行 "执行" 块内的代码。如果（ ）里表达式为假 ，则运行 "否则" 块内的代码。 

---

1.7 实验代码

<span style="color: rgb(255, 76, 65); background: rgb(255, 251, 0);">你可以打开我们提供的代码，也可以自己编写代码，其编写代码的过程可以参考 “**第六课 按键传感器检测实验**”，这里就不重复讲解：</span>

![Img](./media/img-20241114091355.png)

---

1.8 实验结果

按照接线图正确接好模块后再上传代码，上传成功后，给主控板供电，打开串口监视器，设置波特率为 **<u>9600</u>**。

将倾斜模块往某一边倾斜，若模块上的红色LED**不亮**，串口监视器打印数字电平信号“**1**”；若模块上的红色LED点**亮**，串口监视器打印数字电平信号“**0**”。

![img](./media/121701.png)

![img](./media/121702.png)

![Img](./media/img-20241114091328.png)

---

### 第九课 干簧管检测附近磁场

1.1 项目介绍

在这个套件中，有一个Keyes 干簧管模块，它主要由一个MKA10110 绿色磁簧元件组成。簧管是干式舌簧管的简称，是一种有触点的无源电子开关元件，具有结构简单，体积小便于控制等优点。它的外壳是一根密封的玻璃管，管中装有两个铁质的弹性簧片电板，还灌有一种惰性气体。

实验中，我们通过读取模块上S端高低电平，判断模块附近是否存在磁场；并且在串口监视器上显示测试结果。

---

1.2 模块参数

工作电压 : DC 3.3 ~ 5V 

电流 : 50 mA

最大功率 : 0.3 W

工作温度 ：-10°C ~ +50°C

输出信号 : 数字信号

尺寸 ：32 x 23.8 x 7.4 mm

定位孔大小：直径为 4.8 mm

接口 ：间距为2.54 mm 3pin防反接口

---

1.3 模块原理图

![img](./media/151301.png)

一般状态下，玻璃管中的两个由特殊材料制成的簧片是分开的，此时信号端S被电阻R2上拉为高电平，LED熄灭。当有磁性物质靠近玻璃管时，在磁场磁力线的作用下，管内的两个簧片被磁化而互相吸引接触，簧片就会吸合在一起，使结点所接的电路连通，即信号端S连通GND，此时LED点亮。外磁力消失后，两个簧片由于本身的弹性而分开，线路也就断开了。该传感器就是利用元件这一特性，搭建电路将磁场信号转换为高低电平变换信号。

---

1.4 实验组件

| ![img](./media/KS5016.png) | ![img](./media/KE4015.png) | ![img](./media/3pin.jpg)       | ![img](./media/USB.jpg) |
| ------------------------ | ------------------------ | ---------------------------- | --------------------- |
| ESP32 Plus主板 x1        | Keyes 干簧管模块 x1      | XH2.54-3P 转杜邦线母单线  x1 | USB线  x1             |

---

1.5 模块接线图

![img](./media/151501.png)

---

1.6 代码说明

![Img](./media/img-20241114092540.png)

从指定的数字管脚读取干簧管传感器的数字信号(高/低电平)。

![Img](./media/img-20241113171600.png)

如果（ ）里的表达式为真，则运行 "执行" 块内的代码。如果（ ）里表达式为假 ，则运行 "否则" 块内的代码。 

---

1.7 实验代码

<span style="color: rgb(255, 76, 65); background: rgb(255, 251, 0);">你可以打开我们提供的代码，也可以自己编写代码，其编写代码的过程可以参考 “**第六课 按键传感器检测实验**”，这里就不重复讲解：</span>

![Img](./media/img-20241114092659.png)

---

1.8 实验结果

按照接线图正确接好模块后再上传代码，上传成功后，给主控板供电，打开串口监视器，设置波特率为 **<u>9600</u>**。

拿一块带有磁性的物体靠近干簧管模块，当模块检测到磁场时，value值为0且模块上的红色LED点亮，串口监视器打印出“**0     A magnetic field**”；没有检测到磁场时，value值为1，模块上红色LED熄灭，串口监视器打印出“**1     There is no magnetic field**”。

![Img](./media/img-20241114092747.png)

---


### 第十课 附近有人吗

1.1 项目介绍

在这个套件中，有一个Keyes 人体红外热释传感器，它主要由一个RE200B-P传感器元件组成。它是一款基于热释电效应的人体热释运动传感器，能检测到人体或动物身上发出的红外线，配合菲涅尔透镜能使传感器探测范围更远更广。

实验中，通过读取模块上S端高低电平，判断附近是否有人在运动；并且在串口监视器上显示测试结果。

---

1.2 模块参数

工作电压 : DC 5 ~ 15V 

工作电流 : 50 mA

最大功率 : 0.3 W

静态电流 : <50 uA

工作温度 ：-10°C ~ +50°C

控制信号 : 数字信号

最大检测距离 : 7米

感应角度 : <100 度锥角

尺寸 ：32 x 23.8 x 7.4 mm

定位孔大小：直径为 4.8 mm

接口 ：间距为2.54 mm 3pin防反接口

---

1.3 模块原理图

![img](./media/161301.jpg)

这个模块的原理图可能较前面的模块稍复杂，我们一部分一部分来看。先看电压转换部分，作用是将5V输入电压转换为3.3V输入电压。因为我们模块上用到的热释电红外传感器的工作电压是3.3V，不能直接用5V电压供电使用。有了这个电压转换部分，3.3V输入电压和5V输入电压都适用于此热释电红外传感器。

当红外热释传感器没有检测到红外信号时，红外热释传感器的1脚输出低电平，此时模块上的LED两端有电压差，有电流流过，LED被点亮，MOS管Q1导通（Q1是NPN MOS管，型号为2N7002。由于红外热释传感器的1脚输出低电平，所以Q1的源极Vs=0，而Q1的栅极Vg=3.3V，于是Q1的栅极G和Q1的源极S之间的电压 Vgs = 3.3V 大于Q1的阈值电压 2.5V，Q1导通。），信号端S检测到低电平。

当红外热释传感器检测到红外信号时，红外热释传感器的1脚输出高电平，此时模块上的LED熄灭，MOS管Q1不导通，则信号端S检测到被10K上拉电阻R5拉高的高电平。

---

1.4 实验组件

| ![img](./media/KS5016.png) | ![img](./media/KE4018.png)    | ![img](./media/3pin.jpg)       | ![img](./media/USB.jpg) |
| ------------------------ | --------------------------- | ---------------------------- | --------------------- |
| ESP32 Plus主板 x1        | Keyes 人体红外热释传感器 x1 | XH2.54-3P 转杜邦线母单线  x1 | USB线  x1             |

---

1.5 模块接线图

![img](./media/161501.png)

---

1.6 代码说明

![Img](./media/img-20241114093010.png)

从指定的数字管脚读取人体红外传感器的数字信号(高/低电平)。

![Img](./media/img-20241113171600.png)

如果（ ）里的表达式为真，则运行 "执行" 块内的代码。如果（ ）里表达式为假 ，则运行 "否则" 块内的代码。 

---

1.7 实验代码

<span style="color: rgb(255, 76, 65); background: rgb(255, 251, 0);">你可以打开我们提供的代码，也可以自己编写代码，其编写代码的过程可以参考 “**第六课 按键传感器检测实验**”，这里就不重复讲解：</span>

![Img](./media/img-20241114093102.png)

---

1.8 实验结果

按照接线图正确接好模块后再上传代码，上传成功后，给主控板供电，打开串口监视器，设置波特率为**<u>9600</u>**。

当传感器检测到附近有人在运动时，value值为1，模块上LED熄灭，串口监视器显示“**1   Somebody is in this area!**”；没有检测到附近有人在运动时，value值为0，模块上LED点亮，串口监视器显示“**0   No one!**”。

![Img](./media/img-20241114093216.png)

---

### 第十一课 有源蜂鸣器模块播放声音

1.1 项目介绍

在这个套件中，有一个有源蜂鸣器模块，还有一个功放模块（原理相当于无源蜂鸣器）。在这个实验中，我们来学习尝试控制有源蜂鸣器发出声音。有源蜂鸣器元件内部自带震荡电路，使用时，我们只需要给蜂鸣器元件足够的电压，蜂鸣器就会自动响起。

---

1.2 模块参数

工作电压 : DC 3.3 ~ 5V 

工作温度 ：-10°C ~ +50°C

输入信号 : 数字信号

尺寸 ：32 x 23.8 x 12.3 mm

定位孔大小：直径为 4.8 mm

接口 ：间距为2.54 mm 3pin防反接口

---

1.3 模块原理图

![img](./media/171301.jpg)

从原理图我们可以得知，蜂鸣器的1脚通过串联一个电阻R2连接到电压正极；蜂鸣器的2脚连接到NPN三极管Q1的C极，集电极；Q1的B极，也就是基极通过串联一个电阻R1连接到S信号端；发射集接到GND。

当三极管Q1导通时，蜂鸣器的2脚连通GND，有源蜂鸣器便会工作。那么如何让三极管Q1导通呢？**NPN三极管的导通条件是基极（B）电压比发射极（E）电压高 0.3V 以上，**只需要基极（B）被上拉至高电平即可。虽然三极管Q1的基极（B）有一个下拉电阻R3导致其不导通，但是R3电阻的阻值大，使其为弱下拉电阻。三极管Q1的基极（B）还连接了一个阻值小的强上拉电阻R1，只要我们用单片机IO口给S信号端输入高电平，强上拉电阻R1会将三极管Q1的基极（B）强上拉为高电平，三极管Q1就会导通，有源蜂鸣器就会工作。

---

1.4 实验组件

| ![img](./media/KS5016.png) | ![img](./media/KE4010.png) | ![img](./media/3pin.jpg)       | ![img](./media/USB.jpg) |
| ------------------------ | ------------------------ | ---------------------------- | --------------------- |
| ESP32 Plus主板 x1        | Keyes 有源蜂鸣器模块 x1  | XH2.54-3P 转杜邦线母单线  x1 | USB线  x1             |

---

1.5 模块接线图

![img](./media/171501.png)

---

1.6 代码说明

![Img](./media/img-20241114093516.png)

向指定管脚设置“高”或“低”，选择“高”代表给该管脚设置高电平，有电压，有电流，则有源蜂鸣器鸣叫；选择“低”代表给管脚设置低电平，没电压，没有电流，则有源蜂鸣器不响。

---

1.7 实验代码

<span style="color: rgb(255, 76, 65); background: rgb(255, 251, 0);">你可以打开我们提供的代码，也可以自己编写代码，其编写代码的过程可以参考 “**第二课 LED**”，这里就不重复讲解：</span>

![Img](./media/img-20241114093816.png)

---

1.8 实验结果

按照接线图正确接好模块后再上传代码，上传成功后，给主控板供电，模块上有源蜂鸣器响起0.5秒，停0.5秒，循环交替。

---


### 第十二课 8002b功放 喇叭模块

1.1 项目介绍

在这个套件中，有一个Keyes 8002b功放 喇叭模块，这个模块主要由一个可调电位器、一个喇叭和一个音频放大芯片组成。上一课我们学习了有源蜂鸣器模块的使用方法，这一课我们来学习套件中的8002b功放 喇叭模块的使用方法。这个模块主要功能是：可以对输出的小音频信号进行放大，大概放大倍数为8.5倍，并且可以通过自带的小功率喇叭播放出来，也可以用来播放音乐，作为一些音乐播放设备的外接扩音设备。

---

1.2 模块参数

工作电压 : DC 5V 

工作电流 : ≥100 mA

最大功率 : 2.5 W

喇叭功率 : 0.15 W

喇叭声音 : 80 db

放大芯片 : SC8002B

工作温度 ：-10°C ~ +50°C

尺寸 ：47.6 x 23.8 x 10 mm

定位孔大小：直径为 4.8 mm

接口 ：间距为2.54 mm 3pin防反接口

---

1.3 模块原理图

![img](./media/181301.jpg)

其实这个喇叭就类似于于一个无源蜂鸣器，上一课我们介绍过，有源蜂鸣器自带振荡源，只要我们给它足够的电压就能响起来，而无源蜂鸣器元件内部不带震荡电路，需要在元件正极（也就是1脚）输入不同频率的方波，负极（也就是2脚）接地，从而控制蜂鸣器响起不同频率的声音。

---

1.4 实验组件

| ![img](./media/KS5016.png) | ![img](./media/KE4067.png)    | ![img](./media/3pin.jpg)       | ![img](./media/USB.jpg) |
| ------------------------ | --------------------------- | ---------------------------- | --------------------- |
| ESP32 Plus主板 x1        | Keyes 8002b功放 喇叭模块 x1 | XH2.54-3P 转杜邦线母单线  x1 | USB线  x1             |

---

1.5 模块接线图

![img](./media/181501.png)

---

1.6 代码说明

![Img](./media/img-20241030112339.png)

向指定管脚关闭功放喇叭模块，使喇叭不发声。

![Img](./media/img-20241030112545.png)

向指定管脚设置功放喇叭模块发声的音调和节拍。

![Img](./media/img-20241030112733.png)

向指定管脚设置功放喇叭模块播放特定音乐。

![Img](./media/img-20241118102147.png)

---

1.7 实验代码

你可以打开我们提供的代码，也可以自己编写代码，其如下：

1. 从 “![Img](./media/img-20241023140031.png)” 拖出 “![Img](./media/img-20241023140106.png)”。

2. 从 “![Img](./media/img-20241024131848.png)” 拖出 “ ![Img](./media/img-20241030113019.png) ” 放入 “![Img](./media/img-20241023140106.png)”，管脚为 4  。

3. 先从 “![Img](./media/img-20241024131848.png)” 拖出 “ ![Img](./media/img-20241118102224.png) ” ，管脚为 4 ，选择 “Christmas” ；再拖出 “ ![Img](./media/img-20241030113019.png) ” ，管脚为 4 。

4. 从 “![Img](./media/img-20241023140031.png)” 拖出 “![Img](./media/img-20241023140625.png)”，设置延时为2000毫秒。

5. 复制代码块 “ ![Img](./media/img-20241118102331.png) ” 1 次，选择 “Birthday” 。

完整代码：

![Img](./media/img-20241118102103.png)

---

1.8 实验结果

代码上传成功后，拔下USB线断电，按照接线图正确接好模块后再用USB线连接到计算机上电，功放喇叭模块循环播放音乐。如果觉得喇叭声音太大或太小，可以使用十字螺丝刀调节模块上的电位器以调整音量大小。

---


### 第十三课 读取旋转电位器传感器的值

1.1 项目介绍

在这个套件中，有一个Keyes 旋转电位器传感器，它一个模拟传感器。前面我们学习过的传感器，都是数字传感器。例如我们前面学习的按键模块，当按键没有按下去时，我们读取到高电平（3.3V），当按键按下去时，我们读取到低电平（0V），而在0~3.3V中间的电压值，我们数字IO口无法读取到，当然按键模块也只能输出高低电平。而模拟传感器就可以通过我们ESP32主板上的16个ADC模拟口读取中间的电压值。

---

1.2 模块参数

工作电压 : DC 3.3 ~ 5V 

工作电流 : 20 mA

工作功率 : 0.1 W

工作温度 ：-10°C ~ +50°C

输出信号 : 模拟信号

尺寸 ：32 x 23.8 x 28.4 mm

定位孔大小：直径为 4.8 mm

接口 ：间距为2.54 mm 3pin防反接口

---

1.3 模块原理图

![img](./media/201301.png)

旋转电位器原理是靠电刷在电阻体上滑动，在电路中获取与输入电压形成一定关系地输出电压。Keyes 旋转电位器传感器选用了一个10K可调电阻。通过旋转电位器，我们可以改变电阻大小，信号端S检测到电压变化（0 ~ 3.3V），而这个电压变化是一个连续变化的模拟量，也就是在0~3.3V内可以取任意值，我们必须先对这个模拟量进行ADC采集，来测量连续的这些模拟量。A/D 是模拟量到数字量的转换，依靠的是模数转换器(Analog to Digital Converter)，简称ADC。我们的ESP32主板已经集成了ADC采集，可以直接使用。

我们的ESP32主板ADC位数是12位。一个 n 位的 ADC 表示这个 ADC 共有 2 的 n 次方个刻度，12位的 ADC，输出的是从0～4095一共4096个数字量，也就是 2 的 12 次方个数据刻度，每个刻度就是3.3V/4095≈0.00081V，这也叫分辨率。

ADC：ADC是一种电子集成电路，用于将模拟信号(如电压)转换为由1和0表示的数字信号。我们在ESP32上的ADC的范围是12位（ADC的位数表示将模拟量转换成数字量后所用的二进制位数），其可存储数字量范围为：0 ~ 2^12即0 ~ 4096。假设它的参考电压是3.3V，也就是说把参考电压分成4095份，最小分辨率为3.3V/4095，模拟值的范围对应于ADC值。因此，ADC拥有的比特越多，模拟的分区就越密集，最终转换的精度也就越高。

![img](./media/201302.png)

纵坐标数字0 : 0V ~ 3.3/4095V 范围内的模拟量（横坐标）;

纵坐标数字1 : 3.3/ 4095V ~ 2*3.3 /4095V 范围内的模拟量（横坐标）;

......

模拟将被相应地划分。换算公式如下：

![img](./media/201303.png)

DAC：这一过程的可逆需要DAC，数字到模拟转换器。数字I/O端口可以输出高电平和低电平(0或1)，但不能输出中间电压值，这就是DAC有用的地方。ESP32有两个8位精度的DAC输出引脚GPIO25和GPIO26，可以将VCC(这里是3.3V)分成2^8=256个部分。例如，当数字量为1时，输出电压值为3.3/256 * 1V，当数字量为128时，输出电压值为3.3/256 *128=1.65V, DAC的精度越高，输出电压值的精度就越高。

换算公式如下：

![img](./media/201304.png)

ADC on ESP32：

ESP32有16个引脚，可以用来测量模拟信号。GPIO引脚序列号和模拟引脚定义如下表所示：

| **ADC number in ESP32** | **ESP32 GPIO number** |
| ----------------------- | --------------------- |
| ADC0                    | GPIO 36               |
| ADC3                    | GPIO 39               |
| ADC4                    | GPIO 32               |
| ADC5                    | GPIO33                |
| ADC6                    | GPIO34                |
| ADC7                    | GPIO 35               |
| ADC10                   | GPIO 4                |
| ADC11                   | GPIO0                 |
| ADC12                   | GPIO2                 |
| ADC13                   | GPIO15                |
| ADC14                   | GPIO13                |
| ADC15                   | GPIO 12               |
| ADC16                   | GPIO 14               |
| ADC17                   | GPIO27                |
| ADC18                   | GPIO25                |
| ADC19                   | GPIO26                |

DAC on ESP32：

ESP32有两个8位数字模拟转换器，分别连接到GPIO25和GPIO26引脚，它是不可变的。如下表所示：

| **Simulate pin number** | **GPIO number** |
| ----------------------- | --------------- |
| DAC1                    | GPIO25          |
| DAC2                    | GPIO26          |

---

1.4 实验组件

| ![img](./media/KS5016.png) | ![img](./media/KE4030.png)  | ![img](./media/3pin.jpg)       | ![img](./media/USB.jpg) |
| ------------------------ | ------------------------- | ---------------------------- | --------------------- |
| ESP32 Plus主板 x1        | Keyes 旋转电位器传感器 x1 | XH2.54-3P 转杜邦线母单线  x1 | USB线  x1             |

---

1.5 模块接线图

![img](./media/201501.png)

---

1.6 代码说明

![Img](./media/img-20241031092741.png)

从指定的模拟管脚读取旋转电位器的模拟信号，模拟信号的范围为：0 ~ 4095 。ESP32主板包含一个多通道、12位模数转换器。 这意味着它会将 从0V和工作电压（5V 或 3.3V，本实验中是3.3V）之间的输入电压映射为0和4095之间的整数值。这会产生以下分辨率：3.3V/4096单位即每单位 0.0008V。

详细了解请参考链接：[https://vimsky.com/examples/usage/arduino-language-functions-analog-io-analogread-ar.html](https://vimsky.com/examples/usage/arduino-language-functions-analog-io-analogread-ar.html) 。

![Img](./media/img-20241114102002.png)

在串口监视器中自动换行打印旋转电位器的模拟信号。

---

1.7 实验代码

你可以打开我们提供的代码，也可以自己编写代码，其如下：

1. 从 “![Img](./media/img-20241023140031.png)” 拖出 “![Img](./media/img-20241023140106.png)”。

2. 从 “![Img](./media/img-20241023140218.png)” 拖出 “![Img](./media/img-20241023140243.png)” 放入 “![Img](./media/img-20241023140106.png)”，设置波特率为 9600 。

3. 先从 “![Img](./media/img-20241023140218.png)” 拖出 “![Img](./media/img-20241029151254.png)” ；接着从 “ ![Img](./media/img-20241029151343.png) ” 拖出 “ ![Img](./media/img-20241031095329.png) ”，管脚为 34 。

4. 从 “![Img](./media/img-20241023140031.png)” 拖出 “![Img](./media/img-20241029134512.png)”，设置延时为100毫秒。

完整代码：

![Img](./media/img-20241114101828.png)

---

1.8 实验结果

按照接线图正确接好模块后再上传代码，上传成功后，给主控板供电，打开串口监视器，设置波特率为 **<u>9600</u>**。

转动电位器手柄时，串口监视器打印出此时电位器的模拟值。

![Img](./media/img-20241114103141.png)


---


### 第十四课 声音传感器检测声量

1.1 项目介绍

在这个套件中，有一个Keyes 声音传感器。实验中，我们利用这个传感器测试当前环境中的声音输出对应的模拟值。声音越大，模拟值越大；并在串口监视器上显示测试结果。

---

1.2 模块参数

工作电压 : DC 3.3 ~ 5V 

工作电流 : 100 mA

最大功率 : 0.5 W

工作温度 ：-10°C ~ +50°C

输出信号 : 模拟信号

尺寸 ：32 x 23.8 x 10.3 mm

定位孔大小：直径为 4.8 mm

接口 ：间距为2.54 mm 3pin防反接口

---

1.3 模块原理图

![Img](./media/img-20241203092916.png)

Keyes 声音传感器主要由一个高感度麦克风元件和LM358音频功率放大器芯片组成。高感度麦克风元件用于检测外界的声音。利用LM358音频功率放大器芯片设计对高感度麦克风检测到的声音进行放大的电路，最大倍数为200倍。使用时我们可以通过旋转传感器上电位器，调节声音的放大倍数。顺时针调节电位器到尽头，放大倍数最大。

---

1.4 实验组件

| ![img](./media/KS5016.png) | ![img](./media/KE4027.png) | ![img](./media/3pin.jpg)       | ![img](./media/USB.jpg) |
| ------------------------ | ------------------------ | ---------------------------- | --------------------- |
| ESP32 Plus主板 x1        | Keyes 声音传感器 x1      | XH2.54-3P 转杜邦线母单线  x1 | USB线  x1             |

---

1.5 模块接线图

![img](./media/221501.png)

---

1.6 代码说明

![Img](./media/img-20241114104056.png)

从指定的模拟管脚读取声音传感器的模拟信号，模拟信号的范围为：0 ~ 4095 。ESP32主板包含一个多通道、12位模数转换器。 这意味着它会将 从0V和工作电压（5V 或 3.3V，本实验中是3.3V）之间的输入电压映射为0和4095之间的整数值。这会产生以下分辨率：3.3V/4096单位即每单位 0.0008V。

详细了解请参考链接：[https://vimsky.com/examples/usage/arduino-language-functions-analog-io-analogread-ar.html](https://vimsky.com/examples/usage/arduino-language-functions-analog-io-analogread-ar.html) 。

![Img](./media/img-20241114104151.png)

在串口监视器中自动换行打印声音传感器的模拟信号。

---

1.7 实验代码

<span style="color: rgb(255, 76, 65); background: rgb(255, 251, 0);">你可以打开我们提供的代码，也可以自己编写代码，其编写代码的过程可以参考 “**第十三课 读取旋转电位器传感器的值**”，这里就不重复讲解：</span>

![Img](./media/img-20241114104130.png)

---

1.8 实验结果

按照接线图正确接好模块后再上传代码，上传成功后，给主控板供电，打开串口监视器，设置波特率为 **<u>9600</u>**。

串口监视器打印出声音传感器接收到的声音对应的模拟值。对准MIC头大声说话，可以看到接收到的声音对应的模拟值变大。

![Img](./media/img-20241114104523.png)

---

### 第十五课 光敏电阻传感器

1.1 项目介绍

在这个套件中，有一个Keyes 光敏电阻传感器，这是一个常用的光敏电阻传感器，它主要由一个光敏电阻元件组成。光敏电阻元件的阻值随着光照强度的变化而变化，此传感器就是利用光敏电阻元件这一特性，设计电路将阻值变化转换为电压变化。光敏电阻传感器可以模拟人对环境光线的强度的判断，方便做出与人友好互动的应用。

---

1.2 模块参数

工作电压 : DC 3.3 ~ 5V 

电流 : 20 mA

最大功率 : 0.1 W

工作温度 ：-10°C ~ +50°C

输出信号 : 模拟信号

尺寸 ：32 x 23.8 x 7.4 mm

定位孔大小：直径为 4.8 mm

接口 ：间距为2.54 mm 3pin防反接口

---

1.3 模块原理图

![img](./media/231301.png)

当没有光照射时，电阻大小为0.2 MΩ，光敏电阻的信号端（2脚）检测的电压接近0。随着光照强度增大，光线传感器的电阻值越来越小，所以信号端能检测到的电压越来越大。

---

1.4 实验组件

| ![img](./media/KS5016.png) | ![img](./media/KE4026.png) | ![img](./media/3pin.jpg)       | ![img](./media/USB.jpg) |
| ------------------------ | ------------------------ | ---------------------------- | --------------------- |
| ESP32 Plus主板 x1        | Keyes 光敏电阻传感器 x1  | XH2.54-3P 转杜邦线母单线  x1 | USB线  x1             |

---

1.5 模块接线图

![img](./media/231501.png)

---

1.6 代码说明

![Img](./media/img-20241114104932.png)

从指定的模拟管脚读取光敏电阻传感器的模拟信号，模拟信号的范围为：0 ~ 4095 。ESP32主板包含一个多通道、12位模数转换器。 这意味着它会将 从0V和工作电压（5V 或 3.3V，本实验中是3.3V）之间的输入电压映射为0和4095之间的整数值。这会产生以下分辨率：3.3V/4096单位即每单位 0.0008V。

详细了解请参考链接：[https://vimsky.com/examples/usage/arduino-language-functions-analog-io-analogread-ar.html](https://vimsky.com/examples/usage/arduino-language-functions-analog-io-analogread-ar.html) 。

![Img](./media/img-20241114104855.png)

在串口监视器中自动换行打印光敏电阻传感器的模拟信号。

---

1.7 实验代码

<span style="color: rgb(255, 76, 65); background: rgb(255, 251, 0);">你可以打开我们提供的代码，也可以自己编写代码，其编写代码的过程可以参考 “**第十三课 读取旋转电位器传感器的值**”，这里就不重复讲解：</span>

![Img](./media/img-20241114104746.png)

---

1.8 实验结果

按照接线图正确接好模块后再上传代码，上传成功后，给主控板供电，打开串口监视器，设置波特率为 **<u>9600</u>**。

串口监视器打印出光敏传感器的模拟值。光照越强，可以看到模拟值越大。

![Img](./media/img-20241114103141.png)

---


### 第十六课 NTC-MF52AT模拟温度传感器

1.1 项目介绍

在这个套件中，有一个Keyes NTC-MF52AT模拟温度传感器，它的原理与光敏电阻传感器类似，只是感应的器件不同。将传感器信号端接到ESP32主板模拟口，可以读出对应的模拟值和温度值。我们可以利用模拟值，输出电压值，通过特定公式，计算出当前环境的温度。

---

1.2 模块参数

工作电压 : DC 3.3 ~ 5V 

电流 : 20 mA

最大功率 : 0.1 W

工作温度 ：-10°C ~ +50°C

输出信号 : 模拟信号

尺寸 ：32 x 23.8 x 7.4 mm

定位孔大小：直径为 4.8 mm

接口 ：间距为2.54 mm 3pin防反接口

---

1.3 模块原理图

![img](./media/241301.png)

Keyes NTC-MF52AT模拟温度传感器主要由NTC-MF52AT热敏电阻元件组成。NTC-MF52AT热敏电阻元件能够感知周边环境温度的变化，随着温度的升高，热敏电阻的阻值降低，4.7K电阻两端的电压上升，从而引起信号端S的电压变化。

**NTC 热敏电阻温度计算公式：Rt = R * EXP( B * (1/T1-1/T2) ) 。**

其中，T1和T2指的是K度，即开尔文温度。K度=273.15(绝对温度)+摄氏度。

Rt 是热敏电阻在周围温度为T1（当前温度）时的电阻值。

R是热敏电阻在周围温度为T2常温（常温取25℃）时的标称阻值。参考规格书可知我们用的NTC-MF52AT模拟温度传感器在 25℃ 下热敏电阻的零功率电阻值为10KΩ ± 5%（即R=10K），T2=(273.15+25) 。

B值是热敏电阻的重要参数，为材料常数，在25℃下测得。参考规格书可知B值为 3950±1%。

EXP() 是e^()，e的n次方。

通过转换可以得到温度T1与电阻Rt的关系：T1=1 / (ln(Rt/R) /B+1/T2) ，这里可以将ln换算成log，即T1=1/ ( log(Rt/R)/B + 1/T2 ) 。

那么我们唯一需要知道的就是Rt的值。回到上面的原理图，设热敏电阻两端电压为VRt，固定的 R1电阻两端的电压为VR，由电阻分压知识VR/VRt = R1/Rt可以知道：Rt = R1 *(3.3-VR)/VR 。而我们实际得到的VR是转换后的ADC值，需要转换成电压值，即VR = adcValue / 4095.0 * 3.3。

**注意**：计算出来的温度是开尔文温度，因此需要减去K值，对应的摄氏温度 t = T1 - 273.15，同时加上0.5的误差矫正。

---

1.4 实验组件

| ![img](./media/KS5016.png) | ![img](./media/KE4025.png)    | ![img](./media/3pin.jpg)       | ![img](./media/USB.jpg) |
| ------------------------ | --------------------------- | ---------------------------- | --------------------- |
| ESP32 Plus主板 x1        | NTC-MF52AT模拟温度传感器 x1 | XH2.54-3P 转杜邦线母单线  x1 | USB线  x1             |

---

1.5 模块接线图

![img](./media/241501.png)

---

1.6 代码说明

![Img](./media/img-20241029135544.png)

读取模拟温度传感器(热敏电阻)的温度值。

![Img](./media/img-20241114110105.png)

在串口监视器中自动换行打印模拟温度传感器(热敏电阻)的温度值。

---

1.7 实验代码

你可以打开我们提供的代码，也可以自己编写代码，其如下：

1. 从 “![Img](./media/img-20241023140031.png)” 拖出 “![Img](./media/img-20241023140106.png)”。

2. 从 “![Img](./media/img-20241023140218.png)” 拖出 “![Img](./media/img-20241023140243.png)” 放入 “![Img](./media/img-20241023140106.png)”，设置波特率为 9600 。

3. 先从 “![Img](./media/img-20241023140218.png)” 拖出 “![Img](./media/img-20241029130617.png) ” ；接着从 “![Img](./media/img-20241104104046.png)” 拖出  “![Img](./media/img-20241104104112.png)” ；将 “自动换行” 改成 “不换行” ，“hello” 改成 “Temperature:” 。

4. 先从 “![Img](./media/img-20241023140218.png)” 拖出 “![Img](./media/img-20241029130617.png) ” ；接着从 “![Img](./media/img-20241029135740.png)” 拖出  “![Img](./media/img-20241029135820.png)” ，管脚为 34 ；将 “自动换行” 改成 “不换行” 。
 
5. 复制代码块 “ ![Img](./media/img-20241104104423.png)” 1次，将 “不换行” 改成 “自动换行” ，“Temperature:” 改成 “ ℃ ” ；再从 “![Img](./media/img-20241023140031.png)” 拖出 “![Img](./media/img-20241029134512.png)”，设置延时为100毫秒。

完整代码：

![Img](./media/img-20241114105523.png)

---

1.8 实验结果

按照接线图正确接好模块后再上传代码，上传成功后，给主控板供电，打开串口监视器，设置波特率为 **<u>9600</u>**。

串口监视器打印出热敏传感器当前所处环境下的温度值。

![Img](./media/img-20241114105753.png)


---

### 第十七课 薄膜压力传感器

1.1 项目介绍

在这个套件中，有一个Keyes 薄膜压力传感器，薄膜压力传感器是基于新型纳米压敏材料辅以舒适杨式模量的超薄薄膜衬底一次性贴片而成，兼具防水和压敏双重功能。

通过采集模块上S端模拟信号，判断压力大小。模拟值越小，压力越大；并在串口监视器上显示测试结果。

---

1.2 模块参数

工作电压 : DC 3.3 ~ 5V

电流 : 20 mA

最大功率 : 0.1W

量程 : 0-5KG

响应点 : 150g

重复性 : ＜±9.7%（60%负载）

一致性 : ±10%

耐久性 : ＞100万次

初始电阻 : 大于10MΩ(无负载)

响应时间 : ＜1ms

恢复时间 : ＜15ms

工作温度 ：-10°C ~ +50°C

输出信号 : 模拟信号

尺寸 ：32 x 23.8 x 7.4 mm

定位孔大小：直径为 4.8 mm

接口 ：间距为2.54 mm 3pin防反接口

---

1.3 模块原理图

![img](./media/251301.png)

当传感器感知到外界压力时，传感器的电阻值发生变化。Keyes 薄膜压力传感器使用LM321运算放大器芯片将传感器感知到的压力变化的压力信号转换成相应变化强度的电信号输出。这样就可以通过检测电压信号变化得知压力变化情况。

---

1.4 实验组件

| ![img](./media/KS5016.png) | ![img](./media/KE4069.png) | ![img](./media/3pin.jpg)       | ![img](./media/USB.jpg) |
| ------------------------ | ------------------------ | ---------------------------- | --------------------- |
| ESP32 Plus主板 x1        | Keyes 薄膜压力传感器 x1  | XH2.54-3P 转杜邦线母单线  x1 | USB线  x1             |

---

1.5 模块接线图

![img](./media/251501.png)

---

1.6 代码说明

![Img](./media/img-20241114111054.png)

从指定的模拟管脚读取薄膜压力传感器的模拟信号，模拟信号的范围为：0 ~ 4095 。

![Img](./media/img-20241114111115.png)

在串口监视器中自动换行打印薄膜压力传感器的模拟信号。

---

1.7 实验代码

<span style="color: rgb(255, 76, 65); background: rgb(255, 251, 0);">你可以打开我们提供的代码，也可以自己编写代码，其编写代码的过程可以参考 “**第十三课 读取旋转电位器传感器的值**”，这里就不重复讲解：</span>

![Img](./media/img-20241114111154.png)

---

1.8 实验结果

按照接线图正确接好模块后再上传代码，上传成功后，给主控板供电，打开串口监视器，设置波特率为 **<u>9600</u>**。为了使实验数据最精准，请将薄膜压力传感器尽量平放。

串口监视器打印出薄膜压力传感器的模拟值。用手按压薄膜时，随着力量的增大，可以看到模拟值逐渐变小。

![Img](./media/img-20241114111515.png)

---

### 第十八课 摇杆模块

1.1 项目介绍

你看过游戏手柄吗？游戏手柄上有按键，还有摇杆。摇杆是什么工作原理呢？在我们这个套件中，就有一个Keyes 摇杆模块，它的主要元件是PS2手柄摇杆。控制时，我们需要将模块的X端口和Y端口连接至单片机的模拟口。B端口连接至单片机数字口，V端口接至单片机电源输出端（3.3-5V），GND接单片机GND。通过读取两个模拟值和一个数字口的高低电平情况，可以判断模块上摇杆的工作状态。

---

1.2 模块参数

工作电压 : DC 3.3 ~ 5V 

电流 : 50 mA

最大功率 : 0.25 W

输出信号 : 信号端X、Y 模拟电压输出

信号端B  : 数字电平输出 

工作温度 ：-10°C ~ +50°C

控制信号 : 数字信号

尺寸 ：47.6 x 23.8 x 34.5 mm

定位孔大小：直径为 4.8 mm

接口 ：间距为2.54 mm 5pin防反接口

---

1.3 模块原理图

![img](./media/301301.png)

其实它的原理非常简单，内部相当于两个可调电位器（左右和上下）和一个按键。按键没有按下时被R1下拉为低电平，按下时接通VCC即为高电平，与我们前面学习过的按键模块的电平值是相反的。摇动摇杆时内部的电位器就会根据摇杆的摇动调节，从而输出不同的电压，可以读取到模拟值。

---

1.4 实验组件

| ![img](./media/KS5016.png) | ![img](./media/KE4050.png) | ![img](./media/5pin.jpg)       | ![img](./media/USB.jpg) |
| ------------------------ | ------------------------ | ---------------------------- | --------------------- |
| ESP32 Plus主板 x1        | Keyes 摇杆模块 x1        | XH2.54-5P 转杜邦线母单线  x1 | USB线  x1             |

---

1.5 模块接线图

![img](./media/301501.png)

---

1.6 代码说明

![Img](./media/img-20241029153241.png)

读取摇杆模块在X轴、Y轴方向上的模拟值。

![Img](./media/img-20241029153408.png)

读取摇杆模块在Z轴方向上的按键值。

---

1.7 实验代码

你可以打开我们提供的代码，也可以自己编写代码，其如下：

1. 从 “![Img](./media/img-20241023140031.png)” 拖出 “![Img](./media/img-20241023140106.png)”。

2. 从 “![Img](./media/img-20241023140218.png)” 拖出 “![Img](./media/img-20241023140243.png)” 放入 “![Img](./media/img-20241023140106.png)”，设置波特率为 9600 。

3. 先从 “![Img](./media/img-20241023140218.png)” 拖出 “![Img](./media/img-20241029151254.png)” ，将 “自动换行” 改成 “不换行”；接着从 “ ![Img](./media/img-20241029152415.png) ” 拖出 “ ![Img](./media/img-20241029152450.png) ”，将 hello 改成 X: 。

4. 先从 “![Img](./media/img-20241023140218.png)” 拖出 “![Img](./media/img-20241029151254.png)” ，将 “自动换行” 改成 “不换行”；接着从 “ ![Img](./media/img-20241029153615.png) ” 拖出 “ ![Img](./media/img-20241029153652.png) ”，管脚为 34 ，选择 x 。

5. 复制代码块 “![Img](./media/img-20241029153829.png)” 1次，将 X: 改成 Y：; 选择 y ，管脚为 35 。

6. 先复制代码块 “![Img](./media/img-20241114131049.png)” 1 次，将 Y: 改成 Z: ；接着从 “![Img](./media/img-20241023140218.png)” 拖出 “![Img](./media/img-20241029151254.png)” ，再从 “ ![Img](./media/img-20241029153615.png) ” 拖出 “ ![Img](./media/img-20241029154054.png) ”，管脚为 13 。

7. 从 “![Img](./media/img-20241023140031.png)” 拖出 “![Img](./media/img-20241029134512.png)”，设置延时为100毫秒。

完整代码：

![Img](./media/img-20241114131213.png)

---

1.8 实验结果

按照接线图正确接好模块后再上传代码，上传成功后，给主控板供电，打开串口监视器，设置波特率为 **<u>9600</u>**。

串口监视器窗口将打印出当前摇杆X轴和Y轴对应的模拟值以及Z轴对应的数字值，移动摇杆或按下它将改变串口监视器中的模拟值和数字值。当按下摇杆时，Z值为1；未按下摇杆时，Z值为0。X值从左到右由0增长到4095。Y值从下到上由0增长到4095。

![img](./media/301701.png)

在X轴上移动摇杆，使数据从小到大。

![Img](./media/img-20241114131816.png)

在Y轴上移动摇杆，使数据从小到大。

![Img](./media/img-20241114131849.png)

按下摇杆。

![Img](./media/img-20241114131913.png)

---


### 第十九课 SK6812 RGB

1.1 项目介绍

第六课学习了插件RGB模块，利用PWM信号对模块的三个引脚进行调色。我们这个套件中，还有一个Keyes 6812 RGB模块。SK6812 RGB 模块驱动原理与插件RGB模块的驱动原理不相同，只需要一个引脚控制。这是一个集控制电路与发光电路于一体的智能外控LED光源。每个LED原件其外型与一个5050LED灯珠相同，每个元件即为一个像素点，我们这个模块上有四个灯珠即四个像素点。

---

1.2 模块参数

工作电压 : DC 3.3 ~ 5V 

最大功率 : 1W

光源 : SMD 5050 RGB

IC型号 : 4颗/WS2811

灰度等级 : 256级

发光角度 : 180°

发光颜色 : 可以通过控制器调为白，红，黄，蓝，绿,等

工作温度 ：-10°C ~ +50°C

尺寸 ：32 x 23.8 x 7.4 mm

定位孔大小：直径为 4.8 mm

接口 ：间距为2.54 mm 3pin防反接口

---

1.3 模块原理图

![img](./media/321301.png)

从原理图中我们可以看出，这四个像素点灯珠串联。其实不论多少个灯珠串联，我们都可以用一个引脚控制其中任意一个灯让它显示任意一种颜色。像素点内部包含了智能数字接口数据锁存信号整形放大驱动电路，还包含有高精度的内部振荡器和12V高压可编程定电流控制部分，有效保证了像素点光的颜色高度一致。

数据协议采用单线归零码的通讯方式，像素点在上电复位以后，S端接受从控制器传输过来的数据，首先送过来的24bit数据被第一个像素点提取后，送到像素点内部的数据锁存器。这个6812RGB通讯协议与驱动已经在底层封装好了，我们直接调用函数的接口就可以使用。

---

1.4 实验组件

| ![img](./media/KS5016.png) | ![img](./media/KE4009.png) | ![img](./media/3pin.jpg)       | ![img](./media/USB.jpg) |
| ------------------------ | ------------------------ | ---------------------------- | --------------------- |
| ESP32 Plus主板 x1        | Keyes 6812 RGB模块 x1    | XH2.54-3P 转杜邦线母单线  x1 | USB线  x1             |

---

1.5 模块接线图

![img](./media/321501.png)

---

1.6 代码说明

![Img](./media/img-20241118104141.png)

设置 NeoPixel全彩LED 的管脚，灯数。

![Img](./media/img-20241118104216.png)

设置 NeoPixel全彩LED 的管脚，亮度（0~255）.

![Img](./media/img-20241118104309.png)

设置 NeoPixel全彩LED 的点亮，即工作生效。

![Img](./media/img-20241118104434.png)

设置R、G、B值，使NeoPixel全彩LED 点亮不同的颜色灯。

![Img](./media/img-20241118104600.png)

设置 NeoPixel全彩LED 的管脚，灯号和点亮的颜色灯。

![Img](./media/img-20241118104726.png)

选择NeoPixel全彩LED点亮的颜色。

---

1.7 实验代码

你可以打开我们提供的代码，也可以自己编写代码，其如下：

1. 从 “![Img](./media/img-20241023140031.png)” 拖出 “![Img](./media/img-20241023140106.png)”。

2. 从 “![Img](./media/img-20241114134602.png)” 拖出 “![Img](./media/img-20241118105641.png)” 和 “![Img](./media/img-20241118105707.png)” 放入 “![Img](./media/img-20241023140106.png)” ，管脚都设为 4 ，灯数为 4 ，亮度为 60 。

![Img](./media/img-20241118105827.png)

3. 从 “![Img](./media/img-20241114134602.png)” 先拖出 “![Img](./media/img-20241118105946.png)” ，接着拖出 “![Img](./media/img-20241118110018.png)” 放入 “![Img](./media/img-20241118105946.png)” 中；再复制代码块 “![Img](./media/img-20241118110148.png)” 3 次；将管脚都设为 4 ，灯号 依次设为 1、2、3、4，R值 120 都改成 255 ，G值和B值都不变。

![Img](./media/img-20241118110411.png)

4. 先从“![Img](./media/img-20241114134602.png)” 拖出 “![Img](./media/img-20241118110511.png)” ，管脚为 4；再从 “![Img](./media/img-20241023140031.png)” 拖出 “![Img](./media/img-20241023140625.png)”，设置延时为1000毫秒。

![Img](./media/img-20241118110726.png)

4. 复制代码块 “![Img](./media/img-20241118110759.png)” 3 次 ，将 R值 255 G值 0 B值 0 依次改成 R值 0 G值 255 B值 0 ，R值 0 G值 0 B值 255 ，和 R值 255 G值 255 B值 255 。

![Img](./media/img-20241118111032.png)

完整代码：

![Img](./media/img-20241114133714.png)

---

1.8 实验结果

按照接线图正确接好模块后再上传代码，上传成功后，给主控板供电，我们可以看到模块上的4个RGB LED 分别亮红灯、绿灯、蓝灯和白灯。

![img](./media/321701.png)

![191702](./media/321702.png)

---


### 第二十课 旋转编码器模块计数

1.1 项目介绍

在这个套件中，有一个Keyes 旋转编码器模块，也叫开关编码器、旋转编码器。此款编码器有20脉冲20定位点、15脉冲30定位点两种。编码器主要用于汽车电子、多媒体音响、仪器仪表、家用电器、智能家居、计算机周边、医疗器械等领域。主要用于频率调节、亮度调节、温度调节、音量调节的参数控制等。

---

1.2 模块参数

工作电压 : DC 5V 

电流 : 20 mA

最大功率 : 0.1 W

工作温度 ：-10°C ~ +50°C

控制信号 : 数字信号

尺寸 ：32 x 23.8 x 30.6 mm

定位孔大小：直径为 4.8 mm

接口 ：间距为2.54 mm 5pin防反接口

---

1.3 模块原理图

![img](./media/331301.png)

增量式编码器是将位移转换成周期性的电信号，再把这个电信号转变成计数脉冲，用脉冲的个数表明位移的巨细。Keyes 旋转编码器模块采用的是20脉冲旋转编码器元件，它可以通过旋转计数正方向和反方向转动过程中输出脉冲的次数，这种转动计数是没有限制的，复位到初始状态，即从0开始计数。

旋转编码器提供两种交互方式：
- **按钮**   单击旋钮以按下按钮。按下时，按钮将 SW 引脚与 GND 引脚连接，也就是SW引脚的电平为低电平。

- **旋转**   每次旋转旋钮时，会在 DT 和 CLK 引脚上产生一个 LOW 信号。
  

    - 顺时针旋转会导致 CLK 引脚首先变低，然后 DT 引脚也变低。
    
    - 逆时针旋转会导致 DT 引脚先变低，然后 CLK 引脚变低。
    
    两个引脚将在几毫秒内返回高电平。如下图所示：
    
    ![img](./media/331302.png)


---

1.4 实验组件

| ![img](./media/KS5016.png) | ![img](./media/KE4049.png) | ![img](./media/5pin.jpg)       | ![img](./media/USB.jpg) |
| ------------------------ | ------------------------ | ---------------------------- | --------------------- |
| ESP32 Plus主板 x1        | Keyes 旋转编码器模块 x1  | XH2.54-5P 转杜邦线母单线  x1 | USB线  x1             |

---

1.5 模块接线图

![img](./media/331501.png)

---

1.6 代码说明

![Img](./media/img-20241114141537.png)

初始化旋转编码器1的模式、CLK管脚 和 DT管脚。

![Img](./media/img-20241114141651.png)

初始化旋转编码器1的初始为为0。

![Img](./media/img-20241114141738.png)

向左（即：顺时针）旋转旋转编码器1，串口监视器打印的数字逐渐加1。

![Img](./media/img-20241114142015.png)

向右（即：顺时针）旋转旋转编码器1，串口监视器打印的数字逐减少1。

![Img](./media/img-20241114142045.png)

按下按键时，串口监视器打印“Button pressed!”。

---

1.7 实验代码

![Img](./media/img-20241114141434.png)

---

1.8 实验结果

按照接线图正确接好模块后再上传代码，上传成功后，给主控板供电，打开串口监视器，设置波特率为 **<u>9600</u>**。

先顺时针旋转编码器，串口监视器打印出来的数据**<u>增大</u>**；再逆时针旋转编码器，串口监视器打印出来的数据**<u>减小</u>**；最后按下编码器中间按键，串口监视器打印“**<u>Button pressed!</u>**”。

![Img](./media/img-20241114140932.png)

--- 

### 第二十一课 舵机的控制原理

1.1 项目介绍

![img](./media/341101.png)

舵机是一种位置伺服的驱动器，主要是由外壳、电路板、无核心马达、齿轮与位置检测器所构成。舵机有很多规格，但所有的舵机都有外接三根线。由于舵机品牌不同，颜色也会有所差异，我们实验用到的这款舵机分别用棕、红、橙三种颜色进行区分，棕色为接地线，红色为电源正极，橙色为信号线。

![img](./media/341102.png)

舵机分为360度舵机、180度舵机和90度舵机，我们实验用到的这款舵机为90度舵机，但是它转动的角度范围最大接近180度，所以我们也可把它当做180度舵机使用，控制原理都是一样的。

![img](./media/341103.png)

---

1.2 模块参数

工作电压 : DC 3.3 ~ 5V 

工作温度 ：-10°C ~ +50°C

尺寸 ：32.25 x 12.25 x 30.42 mm

接口 ：间距为2.54 mm 3pin接口

---

1.3 模块原理图

![img](./media/341301.png)

舵机的控制信号是周期为20ms （50Hz）的PWM（脉冲宽度调制）信号。

舵机的转动的角度是通过调节PWM信号的占空比来实现的，一般在 0.5ms ~ 2.5ms 的范围内去控制，总间隔为 2ms，相对应舵盘的位置为0度 ~ 180度，呈线性变化。当脉冲宽度为 1.5ms 时，舵机旋转至中间角度，大于 1.5ms 时舵机旋转角度增大，小于 1.5ms 时舵机旋转角度减小。

也就是说，舵机的控制需要单片机产生一个周期为20ms的脉冲信号，以0.5ms到2.5ms的高电平来控制舵机转动的角度。具体脉冲参数下图所示：

![img](./media/341302.png)

注意，由于舵机品牌不同，对于同一信号，不同品牌的舵机旋转的角度也会有所不同。

---

1.4 实验组件

| ![img](./media/KS5016.png) | ![img](./media/9G.jpg)   | ![img](./media/USB.jpg) |
| ------------------------ | ------------------- | --------------------- |
| ESP32 Plus主板 x1        | 9G 180度数字舵机 x1 | USB线  x1             |

---

1.5 代码说明

![Img](./media/img-20241030173136.png)

向指定管脚设置舵机的转动角度和延时。


1.6 实验

1.6.1 实验①：

（1）实验接线图

![img](./media/341501.png)

（2）实验代码

你可以打开我们提供的代码，也可以自己编写代码，其如下：

1. 从 “![Img](./media/img-20241023140031.png)” 拖出 “![Img](./media/img-20241023140106.png)”。

2. 从 “ ![Img](./media/img-20241030173255.png) ” 拖出 “ ![Img](./media/img-20241030173321.png) ” 放入 “![Img](./media/img-20241023140106.png)”，管脚为 4 ，角度为 0 ，延时 200 毫秒。

![Img](./media/img-20241030173438.png)

3. 从 “ ![Img](./media/img-20241030173255.png) ” 拖出 “ ![Img](./media/img-20241030173321.png) ” 3 次，管脚为 4 ，角度分别设置为 0 、90 和180 ，延时都为 1000 毫秒。

![Img](./media/img-20241114143955.png)

完整代码：

![Img](./media/img-20241114143642.png)

按照接线图正确接好模块后再上传代码，上传成功后，给主控板供电，舵机由0度转到90度，停顿1秒；再转到180度，停顿1秒；然后回到0度，停顿1秒，循环转动。

---

1.6.2 实验②：

（1）实验接线图

![img](./media/341501.png)

（2）实验代码

你可以打开我们提供的代码，也可以自己编写代码，其如下：

1. 从 “![Img](./media/img-20241023140031.png)” 拖出 “![Img](./media/img-20241023140106.png)”。

2. 从 “ ![Img](./media/img-20241030173255.png) ” 拖出 “ ![Img](./media/img-20241030173321.png) ” 放入 “![Img](./media/img-20241023140106.png)”，管脚为 4 ，角度为 0 ，延时 200 毫秒。

![Img](./media/img-20241030173438.png)

3. 先从 “![Img](./media/img-20241023140031.png)” 拖出 “ ![Img](./media/img-20241030142241.png) ” 将 从 1 到 10 步长为 1 改成 从 0 到 180 步长为 1；又从 “ ![Img](./media/img-20241030173255.png) ” 拖出 “ ![Img](./media/img-20241030173321.png) ” 放入 “ ![Img](./media/img-20241030173700.png) ” ，管脚为 4 ；再从 “ ![Img](./media/img-20241024133608.png)” 拖出 “ ![Img](./media/img-20241024133651.png) ” 放入 “角度 <span style="color: rgb(255, 76, 65);">0</span> ” 处 ；延时15毫秒。

![Img](./media/img-20241114143121.png)

4. 复制代码块 “ ![Img](./media/img-20241030174059.png) ” 1 次，将 从 0 到 180 步长为 1 改成 从 180 到 0 步长为 -1 。

![Img](./media/img-20241114143138.png)

完整代码：

![Img](./media/img-20241114143347.png)

（3）实验结果

按照接线图正确接好模块后再上传代码，上传成功后，给主控板供电，舵机在0度 ~ 180度之间来回转动，每15ms转动一度。

---


### 第二十二课 超声波传感器的原理

1.1 项目介绍

蝙蝠和某些海洋动物都能够利用高频率的声音进行回声定位或信息交流。它们能通过口腔或鼻腔把从喉部产生的超声波发射出去，利用折回的声波来定向，并判定附近物体的位置、大小以及是否在移动。超声波是一种频率高于20000赫兹的声波，它的方向性好，穿透能力强，易于获得较集中的声能，在水中传播距离远，可用于测距、测速、清洗、焊接、碎石、杀菌消毒等。在医学、军事、工业、农业上有很多的应用。超声波因其频率下限大于人的听觉上限而得名。科学家们将每秒钟振动的次数称为声音的频率，它的单位是赫兹(Hz)。

在这个套件中，有一个HC-SR04超声波传感器，它可以发送出一种频率很高的人类无法听到的超声波信号，这些超声波的信号碰到障碍物，就会立刻反射回来。在接收到返回的信息之后，根据发射信号和接收信号的时间差，计算出传感器和障碍物的详细距离，和蝙蝠飞行的原理一样。

---

1.2 模块参数

超声波传感器工作电压 : DC 5V 

超声波传感器工作电流 : 15 mA

超声波传感器工作频率 : 40 Hz

超声波传感器射程范围 : 2 cm ~ 4 m

超声波传感器测量角度 : <= 15度

超声波传感器输入触发信号 : 10 uS 的TTL脉冲

超声波传感器输出回响信号 : 输出TTL电平信号与射程成正比

工作温度 ：-10°C ~ +50°C

超声波传感器尺寸 ：45.5 x 26.7 x 17.6 mm

超声波转接板模块尺寸 ：32 x 23.8 x 11.85 mm

超声波转接板模块定位孔大小：直径为 4.8 mm

超声波转接板模块接口 ：间距为2.54 mm 4pin防反接口

---

1.3 模块原理图

最常用的超声测距的方法是回声探测法。当有脉冲电压触发时（单片机给Trig引脚发送高电平），超声波发射器探头里的晶片就会振动，继而产生超声波。在超声波发射时刻的同时计数器开始计时，超声波在空气中传播，途中碰到障碍物面阻挡就立即反射回来（Echo引脚发送高电平信号给单片机），超声波接收器收到反射回的超声波就立即停止计时。

超声波是一种声波，其声速V与温度有关。一般情况下超声波在空气中的传播速度为340m/s，根据计时器记录的时间t，就可以计算出超声波探头发射点距障碍物面的距离s，即：s=340t/2 。

![img](./media/351301.png)

HC-SR04超声波测距模块可提供范围为2厘米至4米的非接触式距离感测功能，测距精度可达高到3mm。超声波传感器包括超声波发射器、超声波接收器与控制电路。其基本工作原理：

(1)采用IO口Trig触发测距，给至少10us的高电平信号;

(2)模块自动发送8个40khz的方波，自动检测是否有信号返回；

(3)有信号返回，通过IO口Echo输出一个高电平，高电平持续的时间就是超声波从发射到返回的时间。

![img](./media/351302.png)

---

1.4 实验组件

| ![img](./media/KS5016.png) | ![img](./media/KE4039.png) | ![img](./media/ultrasonic.png) | ![img](./media/4pin.jpg)       | ![img](./media/USB.jpg) |
| ------------------------ | ------------------------ | ---------------------------- | ---------------------------- | --------------------- |
| ESP32 Plus主板 x1        | Keyes 超声波转接模块 x1  | HC-SR04 超声波传感器 x1      | XH2.54-4P 转杜邦线母单线  x1 | USB线  x1             |

---

1.5 模块接线图

![img](./media/351501.png)

![img](./media/351502.png)

---

1.6 代码说明

![Img](./media/img-20241029142305.png)

读取超声波传感器检测的距离。

1.7 实验代码

你可以打开我们提供的代码，也可以自己编写代码，其如下：

1. 从 “![Img](./media/img-20241023140031.png)” 拖出 “![Img](./media/img-20241023140106.png)”。

2. 从 “![Img](./media/img-20241023140218.png)” 拖出 “![Img](./media/img-20241023140243.png)” 放入 “![Img](./media/img-20241023140106.png)”，设置波特率为 115200 。

3. 先从 “ ![Img](./media/img-20241024133608.png)” 拖出 “![Img](./media/img-20241028131724.png)” 放入 “![Img](./media/img-20241023140106.png)” 中，将 “ 整数 ” 改成 “字符串” ；从 “![Img](./media/img-20241028132016.png)” 拖出 “![Img](./media/img-20241028132058.png)” 放入 “![Img](./media/img-20241028131724.png)”中，将 item 改成 distance 。

![Img](./media/img-20241029155850.png)

4. 先从 “ ![Img](./media/img-20241024133608.png)” 拖出 “![Img](./media/img-20241029134032.png)” ；再从 “ ![Img](./media/img-20241029153615.png) ” 拖出 “ ![Img](./media/img-20241029160051.png) ” Trig管脚为 13 ，Echo 管脚为 12 。

![Img](./media/img-20241029160216.png)

5. 先从 “![Img](./media/img-20241023140218.png)” 拖出 “![Img](./media/img-20241029151254.png)” ，将 “自动换行” 改成 “不换行”；接着从 “ ![Img](./media/img-20241029152415.png) ” 拖出 “ ![Img](./media/img-20241029152450.png) ”，将 hello 改成 Distance:  。

![Img](./media/img-20241029160600.png)

6. 先从 “![Img](./media/img-20241023140218.png)” 拖出 “![Img](./media/img-20241029151254.png)” ，将 “自动换行” 改成 “不换行”；接着从 “ ![Img](./media/img-20241024133608.png)” 拖出 “ ![Img](./media/img-20241029160503.png) ”。

![Img](./media/img-20241029160617.png)

7. 复制代码块 “ ![Img](./media/img-20241029160651.png) ” 1次，将 “不换行” 改成 “自动换行” ，Distance: 改成 cm 。

![Img](./media/img-20241029160906.png)

8. 从 “![Img](./media/img-20241023140031.png)” 拖出 “![Img](./media/img-20241029134512.png)”，设置延时为100毫秒。

完整代码：

![Img](./media/img-20241114144536.png)

---

1.8 实验结果

按照接线图正确接好模块后再上传代码，上传成功后，给主控板供电，打开串口监视器，设置波特率为**<u>9600</u>**。

放置障碍物在超声波传感器探头前感应，串口监视器窗口打印出超声波传感器与障碍物之间的距离值。

![Img](./media/img-20241114144651.png)


---


### 第二十三课 红外遥控与接收

1.1 项目介绍

红外线遥控是目前使用最广泛的一种通信和遥控手段。因红外线遥控装置具有体积小、功耗低、功能强、成本低等特点，录音机、音响设备、空凋机以及玩具等其它小型电器装置上纷纷采用红外线遥控。红外遥控的发射电路是采用红外发光二极管发出经过调制的红外光波；红外接收电路由红外接收二极管、三极管或硅光电池组成，它们将红外发射器发射的红外光转换为相应的电信号，再送到后置放大器。

Keyes 红外接收模块选择的是VS1838B红外接收传感器元件，该元件是集接收、放大、解调一体的器件，内部IC就已经完成了解调，输出的就是数字信号。它可接收标准38KHz调制的遥控器信号。

---

1.2 模块参数

工作电压 : DC 3.3 ~ 5V 

电流 : 50 mA

最大功率 : 0.25 W

工作温度 ：-10°C ~ +50°C

控制信号 : 数字信号

尺寸 ：32 x 23.8 x 10.8 mm

定位孔大小：直径为 4.8 mm

接口 ：间距为2.54 mm 3pin防反接口

---

1.3 模块原理图

![img](./media/361301.png)

红外遥控系统的主要部分为调制、发射和接收。红外遥控是以调制的方式发射数据，就是把数据和一定频率的载波进行“与”操作，这样既可以提高发射效率又可以降低电源功耗。调制载波频率一般在30khz到60khz之间，大多数使用的是38kHz，占空比1/3的方波。红外接收的信号端加上了4.7K的上拉电阻R3，工作时，首先等待检测低电平，接收到信号后，信号端立即由高电平转为低电平。

---

1.4 实验组件

| ![img](./media/KS5016.png) | ![img](./media/KE4036.png) | ![img](./media/remote_control.png) | ![img](./media/3pin.jpg)       | ![img](./media/USB.jpg) |
| ------------------------ | ------------------------ | -------------------------------- | ---------------------------- | --------------------- |
| ESP32 Plus主板 x1        | Keyes 红外接收模块 x1    | Keyes 遥控器 x1                  | XH2.54-3P 转杜邦线母单线  x1 | USB线  x1             |

---

1.5 模块接线图

![img](./media/361501.png)

---

1.6 代码说明

![Img](./media/img-20241029112445.png)

红外接收器接收红外遥控器上按键值信号，初始化管脚和等待解码，等等。

![Img](./media/img-20241029112642.png)

串口端口自动换行打印接收到的十六进制的红外遥控器按键值信号。

---

1.7 实验代码

你可以打开我们提供的代码，也可以自己编写代码，其如下：

1. 从 “![Img](./media/img-20241023140031.png)” 拖出 “![Img](./media/img-20241023140106.png)”。

2. 从 “![Img](./media/img-20241023140218.png)” 拖出 “![Img](./media/img-20241023140243.png)” 放入 “![Img](./media/img-20241023140106.png)”，设置波特率为 9600 。

3. 从 “ ![Img](./media/img-20241029112954.png) ” 拖出 “ ![Img](./media/img-20241029113045.png) ” ，管脚为 4 。

4. 先从 “![Img](./media/img-20241023140218.png)” 拖出 “![Img](./media/img-20241029113136.png)” 放入 “ ![Img](./media/img-20241114145108.png) ” 中；再从 “![Img](./media/img-20241029113248.png)” 拖出 “ ![Img](./media/img-20241029114726.png) ” 放入 “![Img](./media/img-20241029113136.png)” 中数字 0 处，将 “不换行” 改成 “自动换行”。

![Img](./media/img-20241114145153.png)

完整代码：

![Img](./media/img-20241114153545.png)

---

18 实验结果

按照接线图正确接好模块后再上传代码，上传成功后，给主控板供电，打开串口监视器，设置波特率为 **<u>9600</u>**。

找到红外遥控器，拔出绝缘片。对准红外接收模块的红外接收传感器的接收头，按下遥控器任意按键，接收到信号后，串口监视器窗口打印出当前接收到的按键值，同时，红外接收传感器上的LED会闪烁。

![Img](./media/img-20241114153428.png)

Keyes 遥控器上每一个按键都对应着一个按键值，如下图所示。

![img](./media/361703.png)

---

### 第二十四课 DS1307时钟模块

1.1 项目介绍

这个模块主要用到的芯片是美国DALLAS公司推出的I2C总线接口实时时钟芯片DS1307，它可独立于CPU工作，不受CPU主晶振及其电容的影响；计时准确，月累积误差一般小于10秒。此芯片还具有主电源掉电情况下的时钟保护电路，DS1307的时钟靠后备电池维持工作，拒绝CPU对其读出和写入访问。同时还具有备用电源自动切换控制电路，因而可在主电源掉电和其它一些恶劣环境场合中保证系统时钟的定时准确性。DS1307具有产生秒、分、时、日、月、年等功能，且具有闰年自动调整功能。同时，DS1307芯片内部还集成有一定容量、具有掉电保护特性的静态RAM，可用于保存一些关键数据。

---

1.2 模块参数

中断类型 : 全天时间

存储器容量 : 56 bytes

存储器类型 : RAM

接口类型 : I2C

时钟频率 : 32.768kHz

特点 : 方波输出

电压, Vcc 最大 : 5V

电源电压 最小 : 4.5V

类型 : RTC

工作温度 ：-10°C ~ +50°C

通讯方式 ：I2C通讯

尺寸 ：47.6 x 23.8 x 9.3 mm

定位孔大小：直径为 4.8 mm

接口 ：间距为2.54 mm 4pin防反接口

---

1.3 模块原理图

![img](./media/391301.png)

DS1307 把8 个寄存器和56 字节的RAM 进行了统一编址，记录年、月、日、时、分、秒及星期; AM、PM 分别表示上午和下午; 56 个字节的NVRAM存放数据; 2线串口; 可编程的方波输出;电源故障检测及自动切换电路;电池电流小于500nA。

主要引脚定义如下： 

| DS1307引脚 | 定义                 |
| ---------- | -------------------- |
| X1、X2     | 32.768kHz 晶振接入端 |
| VBAT       | +3V 电池电压输入     |
| VCC        | 电源电压             |
| SQW        | 方波驱动器           |
| SCL        | 串行时钟             |
| SDA        | 串行数据             |

---

1.4 实验组件

| ![img](./media/KS5016.png) | ![img](./media/KE4072.png)      | ![img](./media/4pin.jpg)       | ![img](./media/USB.jpg) |
| ------------------------ | ----------------------------- | ---------------------------- | --------------------- |
| ESP32 Plus主板 x1        | Keyes DS1307时钟传感器模块 x1 | XH2.54-4P 转杜邦线母单线  x1 | USB线  x1             |

---

1.5 模块接线图

![img](./media/391501.png)

---
1.6 代码说明

![Img](./media/img-20241114170208.png)

初始化 DS1307 时钟模块，将时间设置成实时时间。

![Img](./media/img-20241114170329.png)

如果模块上没有电池那么我们就要设置，如果模块带了电池，那么模块自动在运行，我们就只需要这句代码块。

![Img](./media/img-20241114170423.png)

是用于获取系统的时间和日期，有：年、月、日、时、分、秒、星期。

---

1.7 实验代码

你可以打开我们提供的代码，也可以自己编写代码，其如下：

1. 从 “![Img](./media/img-20241023140031.png)” 拖出 “![Img](./media/img-20241023140106.png)”。

2. 从 “![Img](./media/img-20241023140218.png)” 拖出 “![Img](./media/img-20241023140243.png)” 放入 “![Img](./media/img-20241023140106.png)”，设置波特率为 57600 。

3. 从 “ ![Img](./media/img-20241029153615.png) ” 拖出 “ ![Img](./media/img-20241114171113.png) ” ，设置 年2024 月11 日17 时07 分10 秒 20 ；再拖出 “![Img](./media/img-20241114171311.png)” 。

![Img](./media/img-20241114171339.png)

4. 先从 “![Img](./media/img-20241023140218.png)” 拖出 “![Img](./media/img-20241029151254.png)” 2 次，将 “自动换行” 改成 “不换行”；接着从“ ![Img](./media/img-20241029153615.png) ” 拖出 “ ![Img](./media/img-20241114171556.png) ” ，设置为 <span style="color: rgb(255, 76, 65);">年</span> ；再从 “ ![Img](./media/img-20241029152415.png) ” 拖出 “ ![Img](./media/img-20241029152450.png) ”，将 “hello” 改成空格“  ” 。

![Img](./media/img-20241114171729.png)

5. 复制代码块 “![Img](./media/img-20241114171759.png)” 6 次，将 <span style="color: rgb(255, 76, 65);">年</span> 分别改成：月、日、时、分、秒、星期；再将最后的 “不换行” 改成 “自动换行” ；延时100毫秒。

![Img](./media/img-20241114172113.png)

完整代码：

![Img](./media/img-20241114170853.png)

---

1.8 实验结果

按照接线图正确接好模块后再上传代码，上传成功后，给主控板供电，打开串口监视器，设置波特率为 **<u>57600</u>**。

串口监视器打印出年、月、日、时、分、秒、星期，并每秒刷新一次，显示如下图。

![Img](./media/img-20241114170807.png)

---


### 第二十五课 TM1650四位数码管模块

1.1 项目介绍

Keyes TM1650四位数码管模块选用的 0.36 英寸红色共阴4位数码管的驱动芯片是TM1650。TM1650是一种带键盘扫描接口的LED驱动控制专用电路的芯片。内部集成有MCU输入输出控制数字接口、数据锁存器、LED 驱动、键盘扫描等电路。TM1650性能稳定、质量可靠、抗干扰能力强，可适用于24小时长期连续工作的应用场合。TM1650采用两线串行传输协议通讯（注意：该数据传输协议不是标准的I2C协议）。该芯片只需要通过两个引脚与MCU通讯就可以完成数码管的驱动，可以节省MCU引脚资源。

实验中使用Keyes TM1650四位数码管模块时，我们只需要2根信号线即可使单片机控制4位数码管，大大节约了控制板IO口资源。

---

1.2 模块参数

工作电压 : DC 5V 

电流 : 100 mA

最大功率 : 0.5 W

数码管显示颜色 : 红色

LED极性 : 共阴

通讯方式 ：2线高速串行接口（CLK,DAT）

工作温度 ：-10°C ~ +50°C

尺寸 ：47.6 x 23.8 x 10.6 mm

定位孔大小：直径为 4.8 mm

接口 ：间距为2.54 mm 4pin防反接口

---

1.3 模块原理图

TM1650与MCU之间的通讯采用2线高速串行接口（CLK,DAT），这两个连线分别是数据线DAT和同步时钟线CLK。其中DAT为双向数据传输线，TM1650既用该线从MCU接收数据，也用该线向MCU发送数据。

![img](./media/411301.png)

实验中我们使用封装好的库函数。
如果大家有兴趣也可以接着往下学习了解 1.3.1 TM1650通讯时序格式和 1.3.2 指令集说明，然后再去了解底层的库函数是如何实现的。

#1.3.1 TM1650通讯时序格式

TM1650采用下图1 中2线串行传输协议通讯：

![img](./media/411302.png)

（1）开始信号（START）/结束信号(STOP)

开始信号：保持 CLK 为“1”电平，DAT 从“1”跳“0”，认为是开始信号，如上图1的 A 段；
结束信号：保持 CLK 为“1”电平，DAT 从“0”跳“1”，认为是结束信号，如上图1的 E 段；

（2）ACK 信号

如果本次通讯正常，芯片在串行通讯的第 8 个时钟下降沿后，TM1650 主动把 DAT 拉低，直到 CLK 检测到上升沿，DAT 释放为输入状态（对芯片而言）,如上图1的 D 段。

（3） 写“1”和写“0”

写“1”：保持 DAT 为“1”电平，CLK 从“0”跳到“1”,再从“1”跳到“0”，则认为是写入“1” ，如上图 1的 B 段。
写“0”：保持 DAT 为“0”电平，CLK 从“0”跳到“1”,再从“1”跳到“0”，则认为是写入“0” ，如上图 1的 C 段。

（4） 一个字节（8 位）数据传输格式

![img](./media/411303.png)

一个字节数据的传输格式如图上 2，数据发送时 MSB 在前，LSB 在后，即高位先进。微处理器的数据通过 2 线 串行接口和 TM1650 通信，当 CLK 是高电平时，DAT 上的信号必须保持不变；只有 CLK 上的时钟信号为低电平时， DAT 上的信号才能改变。数据输入的开始条件是 CLK 为高电平时，DAT 由高变低；结束条件是 CLK 为高时，DAT 由低电平变为高电平。 

（5）写显示操作

![img](./media/411304.png)

ADDRESS：显示地址（68H、6AH、6CH、6EH）； 
DATA：显示数据。

（6）完整操作时序

![img](./media/411305.png)

command1：系统命令 48H； 
command2：系统参数设置；
ADDRESS：显示地址（68H、6AH、6CH、6EH）；
DATA：显示数据。

备注：
1、设置系统参数和写入显存数据是两个独立的过程，它们之间的顺序不影响实际应用； 
2、每次输入系统命令（48H）和系统参数设置命令都会改变系统参数，请特别注意待机指令操作。

#1.3.2 指令集说明

（1）数据命令设置 

![img](./media/411306.png)

注意：使用的指令是 16 进制 H，输入数据和读取数据都是从高位开始。

所以在代码中我们数据命令设置为 0x48，使用TM1650点亮数码管的功能，而不使用按键扫描的功能。

（2）显示命令设置

![img](./media/411307.png)

注意：在发送上述系统显示命令前需要先输入系统命令48H,如48H+11H=1级亮度开屏显示。

B[7:0] 这里实际是一个字节数据，只是不同位部分代表不同功能。
B[6:4] ：设置数码管亮度。注意，000 最亮。
B[3]    ：设置是否显示小数点。
B[0]    ：设置数码管的开屏、关屏。

（3） 显存地址

![img](./media/411308.png)

如果要显示小数点，则必须先需要将段模式设置为 8 段输出。

![img](./media/411309.png)

---

1.4 实验组件

| ![img](./media/KS5016.png) | ![img](./media/KE4060.png)      | ![img](./media/4pin.jpg)       | ![img](./media/USB.jpg) |
| ------------------------ | ----------------------------- | ---------------------------- | --------------------- |
| ESP32 Plus主板 x1        | Keyes TM1650四位数码管模块 x1 | XH2.54-4P 转杜邦线母单线  x1 | USB线  x1             |

---

1.5 模块接线图

![img](./media/411501.png)

---

1.6 代码说明

![Img](./media/img-20260120170921.png)

初始化TM1650四位数码管模块的清屏。

![Img](./media/img-20260120170952.png)

四位数码管模块显示 4 位字符串（数字或字母等等）。

---

1.7 实验代码

你可以打开我们提供的代码，也可以自己编写代码，其如下：

1. 从 “![Img](./media/img-20241023140031.png)” 拖出 “![Img](./media/img-20241023140106.png)”。

2. 先点击“显示器”，再点击“![Img](./media/img-20260120170537.png)”，从 “![Img](./media/img-20260120170537.png)” 拖出 “![Img](./media/img-20260120170711.png)” 放入 “![Img](./media/img-20241023140106.png)”。

![Img](./media/img-20260120170742.png)

3. 先从 “ ![Img](./media/img-20241024133608.png)” 拖出 “![Img](./media/img-20241028131724.png)” 放入 “![Img](./media/img-20241023140106.png)” 中；从 “![Img](./media/img-20241028132016.png)” 拖出 “![Img](./media/img-20241028132058.png)” 放入 “![Img](./media/img-20241028131724.png)”中。

![Img](./media/img-20260120171050.png)

4. 先从 “![Img](./media/img-20241023140031.png)” 拖出 “ ![Img](./media/img-20241029165415.png) ” ，从 1 到 10 步长为 1 改成从 0000 到 9999 步长为 1；再从 “ ![Img](./media/img-20241024133608.png)” 拖出 “![Img](./media/img-20241029134032.png)” 放入 “![Img](./media/img-20260120172326.png)” ；然后从 “![Img](./media/img-20241028132016.png)” 拖出 “![Img](./media/img-20241028132058.png)” 放入 “![Img](./media/img-20241029134032.png)” 中，把数字 “0” 改成 “i” 。 

![Img](./media/img-20260120171542.png)

5. 先从 “![Img](./media/img-20260120170537.png)” 拖出 “![Img](./media/img-20260120171750.png)” 放入 “![Img](./media/img-20260120172326.png) ”中；再从 “![Img](./media/img-20260120171840.png)” 拖出 “![Img](./media/img-20260120171924.png)” 放入 “abcd” 处；然后再从 “![Img](./media/img-20260120172035.png)” 拖出 “![Img](./media/img-20260120172107.png)” 放入  “![Img](./media/img-20260120171924.png)” 中；最后从 “![Img](./media/img-20241023140031.png)” 拖出 “![Img](./media/img-20241023140625.png)” 放入 “![Img](./media/img-20260120172326.png) ”中。

![Img](./media/img-20260120172511.png)

完整代码：

![Img](./media/img-20241115091356.png)

---

1.8 实验结果

按照接线图正确接好模块后再上传代码，上传成功后，给主控板供电，4位数码管显示数字，从0开始，每1000毫秒加1，直至加到9999后又从0开始循环。

![](./media/411701.png)

---


### 第二十六课 HT16K33_8X8点阵模块

1.1 项目介绍

点阵，多个LED组成的阵列，他们的集合称为“阵”，其中单个单元称为“点”。8X8点阵共由64个发光二极管组成，且每个发光二极管是放置在行线和列线的交叉点上。

第二课我们学习了一个IO口控制一个led，这节课我们来学习用更少的IO口控制更多的led。

---

1.2 模块参数

工作电压 : DC 5V 

电流 : 200 mA

最大功率 : 1 W

工作温度 ：-10°C ~ +50°C

通讯方式 ：I2C通讯

I2C通信地址 ：0X70

点阵屏显示颜色 ：蓝色

尺寸 ：32 x 23.8 x 9.3 mm

定位孔大小：直径为 4.8 mm

接口 ：间距为2.54 mm 4pin防反接口

---

1.3 模块原理图

![img](./media/421301.png)

如原理图所示，如果想要点亮第一行第一列的LED灯，只需要将C1置高电平、R1置低电平就可以了。如果我们想让第一行led全部点亮，只需要将R1置为低电平，C1~C8全部置为高电平就可以了。原理非常简单，但是这样设置的话我们总共需要用到16个IO口，非常浪费单片机资源。为了节省IO口不浪费单片机资源，我们特别设计了这个HT16K33_8X8点阵模块，利用HT16K33芯片驱动1个8*8点阵，只需要利用单片机的I2C通信端口就能控制点阵的64个发光二极管。

我们这款Keyes HT16K33_8X8点阵模块已经固定了通信地址，地址为0x70。

---

1.4 实验组件

| ![img](./media/KS5016.png) | ![img](./media/KE4066.png)     | ![img](./media/4pin.jpg)       | ![img](./media/USB.jpg) |
| ------------------------ | ---------------------------- | ---------------------------- | --------------------- |
| ESP32 Plus主板 x1        | Keyes HT16K33_8X8点阵模块 x1 | XH2.54-4P 转杜邦线母单线  x1 | USB线  x1             |

---

1.5 模块接线图

![img](./media/421501.png)

---

1.6 代码说明

![Img](./media/img-20241029083648.png)

初始化HT16K338×8点阵屏模块的地址和管脚。

![Img](./media/img-20241029083853.png)

对HT16K338×8点阵屏模块清屏

![Img](./media/img-20241029083953.png)

可以对HT16K338×8点阵屏设置图案，每个灰点对应于模块上的LED ，勾选其中一个灰点，模块上对应的LED点亮。

---

1.7 实验代码

你可以打开我们提供的代码，也可以自己编写代码，其如下：

1. 从 “![Img](./media/img-20241023140031.png)” 拖出 “![Img](./media/img-20241023140106.png)”。

2. 从 “![Img](./media/img-20241029081006.png)” 分别拖出 “![Img](./media/img-20241029084232.png)” 和 “![Img](./media/img-20241029084251.png)” 放入 “![Img](./media/img-20241023140106.png)”，SDA管脚为 21 ，SCL管脚为 22，地址默认为 0x70 。

![Img](./media/img-20241029084434.png)

3. 从 “![Img](./media/img-20241029081006.png)” 拖出 “![Img](./media/img-20241029084537.png)” ，点击灰点(√)，设置显示的图案。

![Img](./media/img-20241029084713.png)

完整代码：

![Img](./media/img-20241029084808.png)

---

1.8 实验结果

上传代码，代码上传成功后，拔下USB线断电。按照接线图正确接好模块后再用USB线连接到计算机上电。HT16K33_8X8点阵模块显示“笑脸”图案。

![img](./media/421701.png)

若代码上传成功后点阵屏不显示“笑脸”图案，尝试按一下RESET键。

![img](./media/RESET.jpg)

---

### 第二十七课 按键控制LED灯

1.1 项目介绍

从前面的实验课程中我们学习了按键模块，按下按键我们的单片机读取到低电平，松开按键读取到高电平。在这一实验课程中，我们将按键模块和紫色LED模块组合实验，实现按下按键LED点亮，再次按下按键LED熄灭，再次按下再次点亮的效果。

---

1.2 实验组件

| ![img](./media/KS5016.png) | ![img](./media/KE4012.png) | ![img](./media/KE4001.png) | ![img](./media/3pin.jpg)       | ![img](./media/USB.jpg) |
| ------------------------ | ------------------------ | ------------------------ | ---------------------------- | --------------------- |
| ESP32 Plus主板 x1        | Keyes 单路按键模块 x1    | Keyes 紫色LED模块 x1     | XH2.54-3P 转杜邦线母单线  x2 | USB线  x1             |

---

1.3 实验接线图

![img](./media/451301.png)

---

1.4 代码说明

![Img](./media/img-20241115103741.png)

布尔型（bool）变量的值只有真 （true) 和假 （false）。 C++中如果值非零就为True,为零就是False。这里可以知道ledState初始值为0。

![Img](./media/img-20241115103826.png)

将ledState的当前值取反后再赋值给ledState本身。

![Img](./media/img-20241115103926.png)

这里延时的作用是软件方法消抖。按键机械触点断开、闭合时，由于触点的弹性作用，按键开关不会马上稳定接通或一下子断开，在闭合及断开的瞬间均伴随有一连串的抖动，为了不产生这种现象而作的措施就是按键消抖。代码中检测出键闭合后执行一个延时程序，10ms的延时，让前沿抖动消失后再一次检测键的状态，如果仍保持闭合状态电平，则确认为真正有键按下.

---

1.5 实验代码

![Img](./media/img-20241115103518.png)

---

1.6 实验结果

按照接线图正确接好模块后再上传代码，上传成功后，给主控板供电，按下按键，LED点亮，再次按下，LED熄灭。循环进行。

![img](./media/451501.png)

![img](./media/451502.png)

---


### 第二十八课 障碍物报警实验

1.1 项目介绍

在前面实验课程中中，我们使用一个输入模块控制另一个输出模块。在这一实验中，我们还是用一个模块控制另一个模块。

生活中，我们可以利用一个检测传感器控制一个有源蜂鸣器响起或者LED点亮，做声光报警设备，如检测磁场（干簧管）、检测倾斜（倾斜模块）等等。这一实验课程中我们将避障传感器和有源蜂鸣器模块组合实验，实现避障传感器检测到障碍物时有源蜂鸣器响起的效果。

---

1.2 实验组件

| ![img](./media/KS5016.png) | ![img](./media/KE4019.png) | ![img](./media/KE4010.png) | ![img](./media/3pin.jpg)       | ![img](./media/USB.jpg) |
| ------------------------ | ------------------------ | ------------------------ | ---------------------------- | --------------------- |
| ESP32 Plus主板 x1        | Keyes 避障传感器 x1      | Keyes 有源蜂鸣器模块 x1  | XH2.54-3P 转杜邦线母单线  x2 | USB线  x1             |

---

1.3 实验接线图

![img](./media/461301.png)

---

1.4 代码解释

![Img](./media/img-20241115110115.png)

避障传感器检测是否有障碍物，读取避障传感器的数字信号赋予变量item，如果检测的障碍物，蜂鸣器鸣叫；否则，蜂鸣器不鸣叫。

---

1.5 实验代码

![Img](./media/img-20241115105102.png)

---

1.6 实验结果

按照接线图正确接好模块后再上传代码，上传成功后，给主控板供电，当避障传感器检测到障碍物时，避障传感器上SLED灯亮起，同时有源蜂鸣器发出声响；当避障传感器检测不到障碍物时，有源蜂鸣器停止发出声响。

![img](./media/461501.png)

---


### 第二十九课 入侵检测报警器

1.1 项目介绍

上一课实验中我们学习了使用避障传感器检测障碍物进行报警提醒。在这一实验课程中我们将人体红外热释传感器、紫色LED模块和有源蜂鸣器模块组合实验，实现人体红外热释传感器检测到附近有人经过时有源蜂鸣器响起，紫色LED快速闪烁的效果。

---

1.2 实验组件

| ![img](./media/KS5016.png) | ![img](./media/KE4018.png)     | ![img](./media/KE4010.png) |
| ------------------------ | ---------------------------- | ------------------------ |
| ESP32 Plus主板 x1        | Keyes 人体红外热释传感器 x1  | Keyes 有源蜂鸣器模块 x1  |
| ![img](./media/KE4001.png) | ![img](./media/3pin.jpg)       | ![img](./media/USB.jpg)    |
| Keyes 紫色LED模块 x1     | XH2.54-3P 转杜邦线母单线  x3 | USB线  x1                |

---

1.3 模块接线图

![img](./media/471301.png)

---

1.4 实验代码

![Img](./media/img-20241115105755.png)

---

1.5 实验结果

按照接线图正确接好模块后再上传代码，上传成功后，给主控板供电，当人体红外热释传感器检测到附近有人经过时，人体红外热释传感器上的红灯灭，有源蜂鸣器发出警报，紫色LED灯快速闪烁。

![img](./media/471501.png)

![img](./media/471502.png)

---

### 第三十课 旋转编码器控制RGB

1.1 项目介绍

在第二十课的实验中我们学习了使用旋转编码器计数。在这一实验课程中我们将旋转编码器模块和共阴RGB模块组合实验，通过旋转编码器计数的结果，控制RGB模块上LED显示不同的颜色。

---

1.2 实验组件

| ![img](./media/KS5016.png)     | ![img](./media/KE4049.png)     | ![img](./media/KE4074.png) |
| ---------------------------- | ---------------------------- | ------------------------ |
| ESP32 Plus主板 x1            | Keyes 旋转编码器模块 x1      | Keyes 共阴RGB模块 x1     |
| ![img](./media/5pin.jpg)       | ![img](./media/4pin.jpg)       | ![img](./media/USB.jpg)    |
| XH2.54-5P 转杜邦线母单线  x1 | XH2.54-4P 转杜邦线母单线  x1 | USB线  x1                |

---

1.3 模块接线图

![img](./media/491301.png)

---

1.4 代码说明

![Img](./media/img-20240606131612.png)

![Img](./media/img-20240606131657.png)是模除运算符。代码中模除的结果是旋转编码器计数的值与3相除的余数。 

---

1.5 实验代码

![Img](./media/img-20241115113703.png)

---

1.5 实验结果

按照接线图正确接好模块后再上传代码，上传成功后，给主控板供电，打开串口监视器，设置波特率为**<u>9600</u>**。

任意方向(<span style="color: rgb(255, 76, 65);">最好先顺时针方向</span>)旋转编码器，串口监视器打印出对应余数；RGB模块上的LED显示余数对应的颜色：余数0显示红色、余数1显示绿色、余数2显示蓝色。按下旋转编码器，RGB模块上LED保持当前颜色不变。是不是很像变色龙呀！

![Img](./media/img-20240611105909.png)

---


### 第三十一课 电位器调节灯光亮度

1.1 项目介绍

从前面的课程实验中我们学习了设计呼吸灯和按键控制LED灯。在这一实验课程中我们尝试将呼吸灯和按键控制LED灯这两个实验现象组合起来，用可调电位器代替按键，实现利用旋转可调电位器读取到的模拟值控制紫色LED亮度的效果。可调电位器模拟值的范围是0 ~ 4095；LED的亮度由PWM值控制，范围为0 ~ 255。

---

1.2 实验组件

| ![img](./media/KS5016.png) | ![img](./media/KE4030.png)  | ![img](./media/KE4001.png) | ![img](./media/3pin.jpg)       | ![img](./media/USB.jpg) |
| ------------------------ | ------------------------- | ------------------------ | ---------------------------- | --------------------- |
| ESP32 Plus主板 x1        | Keyes 旋转电位器传感器 x1 | Keyes 紫色LED模块 x1     | XH2.54-3P 转杜邦线母单线  x2 | USB线  x1             |

---

1.3 模块接线图

![img](./media/501301.png)

---

1.4 代码说明

![Img](./media/img-20241031092741.png)

从指定的模拟管脚读取旋转电位器的模拟信号，模拟信号的范围为：0 ~ 4095 。

详细了解请参考链接：[https://vimsky.com/examples/usage/arduino-language-functions-analog-io-analogread-ar.html](https://vimsky.com/examples/usage/arduino-language-functions-analog-io-analogread-ar.html) 。

![Img](./media/img-20241031101130.png)

将旋转电位器的模拟信号（0 ~ 4095）映射给LED的亮度（0 ~ 255）。

---

1.5 实验代码

![Img](./media/img-20241115114019.png)

---

1.6 实验结果

按照接线图正确接好模块后再上传代码，上传成功后，给主控板供电，旋转电位器，可以调节紫色LED的亮度。

![img](./media/501501.png)

![img](./media/501502.png)

---

### 第三十二课 声控灯

1.1 项目介绍

如今智能家居发展迅速，你使用过智能家居当中的智能声控灯吗？当我们跺跺脚或者拍拍手时，智能声控灯自动亮起；当没有声音时，智能声控灯处于熄灭状态。智能声控灯上安装有声音探测传感器，这些传感器将外界声音的大小，转换成对应数值。智能声控灯设置一个临界点，当声音转换后对应的数值超过该临界点时，灯光亮起一段时间。 

在这一实验课程中，我们将声音传感器和紫色LED模块组合实验，学习制作一个最简单的智能声控灯。

---

1.2 实验组件

| ![img](./media/KS5016.png) | ![img](./media/KE4027.png) | ![img](./media/KE4001.png) | ![img](./media/3pin.jpg)       | ![img](./media/USB.jpg) |
| ------------------------ | ------------------------ | ------------------------ | ---------------------------- | --------------------- |
| ESP32 Plus主板 x1        | Keyes 声音传感器 x1      | Keyes 紫色LED模块 x1     | XH2.54-3P 转杜邦线母单线  x2 | USB线  x1             |

---

1.3 模块接线图

![img](./media/521301.png)

---

1.4 实验代码

![Img](./media/img-20241115115308.png)

---

1.5 实验结果

代码上传成功后，拔下USB线断电，按照接线图正确接好模块后再用USB线连接到计算机上电，打开串口监视器，设置波特率为 **<u>9600</u>**。

串口监视器打印出声音传感器接收到的声音对应的ADC值，接收到的声音增大时ADC值(即：模拟值)也增大，当ADC值(即：模拟值)大于400时，LED模块上LED亮起3秒，然后熄灭。

![Img](./media/img-20241115115536.png)

---

### 第三十三课 超声波雷达

1.1 项目介绍

蝙蝠飞行与获取猎物是通过回声定位的。回声定位：某些动物能通过口腔或鼻腔把从喉部产生的超声波发射出去，利用折回的声音来定向，这种空间定向的方法称为回声定位。科学家们从蝙蝠身上得到的启示发明了雷达，即雷达的天线相当于蝙蝠的嘴,而天线发出的无线电波就相当于蝙蝠的超声波,雷达接收电波的荧光屏就相当于蝙蝠的耳朵。

这一课我们就来学习制作一个简易雷达。将HC-SR04 超声波传感器、8002b功放 喇叭模块、共阴RGB模块和TM1650四位数码管模块组合实验，利用距离大小控制功放喇叭模块模块响起对应频率的声音、RGB亮起对应颜色，然后把这个距离显示在四位数码管上。这样就搭建好了一个简易的超声波雷达系统。

---

1.2 实验组件

| ![img](./media/KS5016.png)     | ![img](./media/ultrasonic.png) | ![img](./media/KE4039.png)      |
| ---------------------------- | ---------------------------- | ----------------------------- |
| ESP32 Plus主板 x1            | HC-SR04 超声波传感器 x1      | Keyes 超声波转接模块 x1       |
| ![img](./media/KE4067.png)     | ![img](./media/KE4074.png)     | ![img](./media/KE4060.png)      |
| Keyes 8002b功放 喇叭模块 x1  | Keyes 共阴RGB模块 x1         | Keyes TM1650四位数码管模块 x1 |
| ![img](./media/3pin.jpg)       | ![img](./media/4pin.jpg)       | ![img](./media/USB.jpg)         |
| XH2.54-3P 转杜邦线母单线  x1 | XH2.54-4P 转杜邦线母单线  x3 | USB线  x1                     |

---

1.3 模块接线图

![img](./media/561301.png)

---

1.4 实验代码

![Img](./media/img-20241115140019.png)

---

1.5 实验结果

按照接线图正确接好模块后再上传代码，上传成功后，给主控板供电。

当超声波传感器检测到障碍物距离范围在10cm 以内时，RGB LED灯亮红色，并将检测到障碍物的距离显示在四位数码管上。同时8002b功放 喇叭模块发出声响，起到提示的作用。

![img](./media/561501.png)

当超声波传感器检测到障碍物距离范围在10cm ~ 20cm 以内时，RGB LED灯亮绿色，并将检测到障碍物的距离显示在四位数码管上。

![img](./media/561502.png)

当超声波传感器检测到障碍物距离范围在20cm 以外时，RGB LED灯亮蓝色，并将检测到障碍物的距离显示在四位数码管上。

![img](./media/561503.png)

--- 

### 第三十四课 红外遥控灯

1.1 项目介绍

在前面实验中，我们学会了点亮或熄灭LED、学会了利用PWM调节灯光的亮度、学会了使用红外接收模块，并将接收到的遥控器对应的键值打印出来。在这一实验课程中，我们将红外接收模块和紫色LED模块组合实验，实现用红外遥控器控制紫色LED的亮灭以及控制紫色LED显示不同亮度。

当红外接收模块接收到红外遥控器的按键值时，通过设置此按键值的输出PWM值实现设置不同LED亮度的效果，控制LED的亮灭也一样。

在这一实验课程中我们使用 “①“、”②“、”③”三个按键来控制紫色LED实现弱亮、正常亮、强亮三种不同亮度。如果想要使用 “OK” 键这一个按键来控制LED亮和灭的两种情况该如何实现呢？这一实验课程我们将学习使用一个新的基本数据类型 —— boolean，来实现同一个按键控制LED亮灭的效果。

**boolean 数据类型**，变量存储为 8位（1 个字节）的数值形式，**只能是 True 或是 False**。boolean 变量的值显示为 True 或 False（在使用 Print 的时候），或者 #TRUE# 或 #FALSE#（在使用 Write # 的时候）。使用关键字True 与 False 可将 boolean 变量赋值为这两个状态中的一个。

设置代码，按下“OK”键且满足某一条件，点亮LED；按下“OK”键且满足另一条件，熄灭LED。这个条件我们用 boolean 来实现是最简单方便的，因为 boolean 只有 True 或是 False 两种状态。我们只需要设置按下“OK”键的同时 flag 为 true，即可点亮LED；同理按下“OK”键的同时 flag 为 false，熄灭LED。

---

1.2 实验组件

| ![img](./media/KS5016.png)         | ![img](./media/KE4036.png)     | ![img](./media/KE4001.png) |
| -------------------------------- | ---------------------------- | ------------------------ |
| ESP32 Plus主板 x1                | Keyes 红外接收模块 x1        | Keyes 紫色LED模块 x1     |
| ![img](./media/remote_control.png) | ![img](./media/3pin.jpg)       | ![img](./media/USB.jpg)    |
| Keyes 遥控器 x1                  | XH2.54-3P 转杜邦线母单线  x2 | USB线  x1                |

---

1.3 模块接线图

![Img](./media/img-20241115151544.png)

---

1.4 代码说明

![Img](./media/img-20241115150350.png)

设置一个变量 flag 为 boolean 数据类型，数值为 true 或 false 。        

![Img](./media/img-20241115150436.png)

boolean 数据类型的 flag 赋值为 false ，以便再次按下 “OK”键时满足熄灭LED的条件。

---

1.5 实验代码

![Img](./media/img-20241115150226.png)

---

1.6 实验结果

按照接线图正确接好模块后再上传代码，上传成功后，给主控板供电，打开串口监视器，设置波特率为 **<u>9600</u>**。

第一次按下红外遥控器上的 “**<u>OK</u>**” 键，紫色LED被点亮，实现开灯的效果。串口监视器打印出按下的按键值和LED灯的亮灭情况：“**<u>FF02FD  led on</u>**” 。

再次按下红外遥控器上的 “**<u>OK</u>**” 键，紫色LED熄灭，实现关灯的效果。串口监视器打印出按下的按键值和LED灯的亮灭情况：“**<u>FF02FD  led off</u>**” 。

按下红外遥控器上的 “**①**” 键，紫色LED被设置为弱亮。串口监视器打印出按下的按键值和LED灯的亮灭情况：“**<u>FF6897  weak light</u>**” 。

按下红外遥控器上的 “**②**” 键，紫色LED被设置为正常亮。串口监视器打印出按下的按键值和LED灯的亮灭情况：“**<u>FF9867  normal light</u>**” 。

按下红外遥控器上的 “**③**” 键，紫色LED被设置为强亮。串口监视器打印出按下的按键值和LED灯的亮灭情况：“**<u>FFB04F  strong light</u>**” 。

![Img](./media/img-20241115152001.png)

---

### 第三十五课 Bluetooth

1.1 项目介绍

ESP32是一系列低成本，低功耗的单片机微控制器，集成了Wi-Fi和双模蓝牙。ESP32 可作为独立系统运行应用程序或作为主机 MCU 的从设备，通过 SPI / SDIO 或 I2C / UART 接口提供 Wi-Fi 和蓝牙功能。

蓝牙是一种短距离通信系统，其简单的数据传输有两种模式：主设备工作模式和从设备工作模式。蓝牙技术规定每一对设备之间进行蓝牙通讯时，必须一个为**主端**，另一个为**从端**，才能进行通信。通信时，必须由主端进行查找，发起配对，建链成功后，双方即可收发数据。

- **<u>主设备工作模式</u>** ：主设备是能够搜索并**主动建立连接**的一方，从扫描状态转化而来的。其可以和一个或多个从设备进行连接通信，它会**定期的扫描**周围的广播状态设备发送的广播信息，可以对周围设备进行搜索并选择所需要连接的从设备进行配对连接，**建立通信链路成功后，主从双方就可以发送接收数据**。例如智能手机，数据传输中做主机的蓝牙模块。

  **一个蓝牙设备以主模式发起连接时，需要知道从设备的地址，配对密码等信息，配对完成后，可直接连接。**同时主设备可以**设置默认连接**从设备的地址，这样主设备模块上电会自动搜索该地址的从设备并且进行连接。并且**支持白名单功能**，用户只需要把需要连接的设备的地址写入白名单中，模块搜索到符合白名单的设备时就进行连接。主从透传协议相同时，用户不需要关注串口数据与无线数据包之间的数据转换过程，只需通过简单的参数设置，即可实现主设备串口与从设备串口之间的数据透传。

  为保证连接的稳定性，预防断电、信号等异常问题导致模块之间断开连接，可以开启断线重连功能，当异常干扰问题消失，模块工作环境恢复正常，主设备会自动搜索刚刚断连的从设备，尽可能减少数据的丢失，提高系统稳定性。

-  **<u>从设备工作模式</u>** ：从设备模式是从广播者模式转化而来的，未被连接的从设备首先进入广播状态，**等待被主机搜索**。当从设备被主机扫描到并**建立连接后**，就可以和主机设备**进行数据的收发**。从设备**不能主动建立连接**。从设备模式的蓝牙模块是可以被连接的，定期的和主机进行连接和数据传输，在数据传输过程中作从机。例如蓝牙手表手环，蓝牙鼠标等工作在从设备模式。

  一对一应用中从设备可以设为两种类型。一是静默状态，即只能与指定的主设备通信，不被别的蓝牙设备查找；二是开发状态，既可被指定主设备查找，也可以被别的蓝牙设备查找后建立连接。

  当手机与ESP32进行数据交换时，**手机通常处于主设备工作模式，ESP32为从设备工作模式。**

这一实验课程我们先学习利用ESP32的蓝牙功能与手机进行简单的数据传输，然后学习用蓝牙控制LED灯的亮灭。

---

1.2 实验组件

在本课程中，我们需要使用一个名为 "**串行蓝牙终端**" 的蓝牙应用程序来协助实验。

点击安装：[https://www.appsapk.com/serial-bluetooth-terminal/](https://www.appsapk.com/serial-bluetooth-terminal/)

| ![img](./media/KS5016.png) | ![img](./media/USB.jpg) | 
| ------------------------ | ------------------------ | 
| ESP32 Plus主板 x1        |  USB线  x1             | 

---

1.3 实验接线图

![img](./media/011301.png)

---

1.4 实验代码

**<span style="color: rgb(255, 76, 65);">提醒：</span>** 此代码从 “ ![Img](./media/img-20241101140602.png) ”  一起拖出，将 “ **ESP32BT** ” 改成 “ **ESP32test** ” 即可。

![Img](./media/img-20241101140501.png)

---

1.5 实验结果

代码上传成功后，打开串口监视器，设置波特率为 **<u>115200</u>**。

**注意：如果打开串口监视器且设置好波特率，串口监视器窗口还是没有显示任何信息，可以尝试按下ESP32的RESET按键。**

![RESET](./media/RESET.jpg)

确保你的手机已经打开蓝牙且已安装 “**串口蓝牙终端**” 应用程序。搜索附近的蓝牙设备，选择 “**ESP32test**” 进行连接。

![img](./media/601302.png)

出现蓝牙配对请求，选择“**<u>配对</u>**”。

![img](./media/601317.png)

![img](./media/601303.png)


配对成功。

![img](./media/601304.png)

打开“串口蓝牙终端”应用程序，单击图示箭头所指地方。选择  "**<u>Devices</u>**"。

![img](./media/601305.png)

![img](./media/601306.png)


选择经典蓝牙模式下的 "**<u>ESP32test</u>**"。

![img](./media/601307.png)

出现连接的成功提示，现在ESP32与你的手机已经建链成功了，可以在ESP32与你的手机之间传输数据了。

![img](./media/601308.png)

先来尝试一下主设备传输数据到从设备，在串口监视器中的文本框输入“Hi!”，当手机收到它的时候，给你的手机回复“Hi!”；

![Img](./media/img-20241101135753.png)

![img](./media/601312.png)

接下来尝试一下从设备传输数据到主设备，手机发送“Hello!”，当电脑收到它的时候，给你的电脑回复“Hello!”。

![img](./media/601309.png)

![Img](./media/img-202411011357530.png)

---

### 第三十六课 WiFi Station Mode

1.1 项目介绍

ESP32有3种不同的WiFi工作模式：

- Station模式（作为WiFi设备主动连接路由器，也叫做WiFi Client）
- AP模式（作为一个Access Point，让其他WiFi设备来连接）即WiFi热点
- Station+AP共存模式（ESP32连接路由器的同时自身也是一个热点供其他WiFi设备来连接）

所有WiFi编程项目在使用WiFi前必须配置WiFi运行模式，否则无法使用WiFi。在这节实验课程中，我们将学习使用ESP32的WiFi Station模式。

**Station 模式：**

当ESP32选择Station模式时，它作为一个WiFi客户端。它可以连接路由器网络，通过WiFi连接与路由器上的其他设备通信。如下图所示，PC和路由器已经连接，ESP32如果要与PC通信，需要将PC和路由器连接起来。

![img](./media/611101.png)

---

1.2 实验组件

| ![img](./media/KS5016.png) | ![img](./media/USB.jpg) |
| ------------------------ | --------------------- |
| ESP32 Plus主板 x1        | USB线  x1             |

---

1.3 模块接线图

![img](./media/011301.png)

---

1.4 实验代码

<span style="background: rgb(255, 251, 0);"><span style="color: rgb(255, 76, 65);">特别提醒：路由器的SSID是无线网的无线名称。SSID是 ServiceSetldentifier 的缩写，意思是:服务集标识。SSID技术可以将一个无线局域网分为几个需要不同身份验证的子网络，每一个子网络都需要独立的身份验证，只有通过身份验证的用户才可以进入相应的子网络，防止未被授权的用户进入本网络。所以在代码运行之前，需要配置 WiFi 名称和密码，将其修改为你自己使用的WiFi 名称和密码。</span>。</span>

![Img](./media/img-20241105083150.png)


你可以打开我们提供的代码，也可以自己编写代码，其如下：

1. 从 “![Img](./media/img-20241023140031.png)” 拖出 “![Img](./media/img-20241023140106.png)”。

2. 从 “ ![Img](./media/img-20241023140218.png)” 拖出 “ ![Img](./media/img-20241023140243.png) ” 放入 “ ![Img](./media/img-20241023140106.png) ” ，设置波特率为 115200 。

3. 从 “![Img](./media/img-20241105083758.png)” 拖出 “![Img](./media/img-20241105083837.png)” 。

完整代码：

![Img](./media/img-20241105090857.png)

---

1.5 实验结果

按照接线图正确接好模块后再上传代码，上传成功后，给主控板供电，打开串口监视器，设置波特率为**<u>115200</u>**。

开始连接，串口监视器打印出“**<u>Connecting to ChinaNet_2.4G</u>**” 提示正在连接到路由器的SSID，当ESP32成功连接到路由器的 SSID 时，串行监视器将打印出 WiFi 分配给ESP32的**<u>IP地址</u>**。

![Img](./media/img-20241105090946.png)

**注意：如果打开串口监视器且设置好波特率，串口监视器窗口还是没有显示任何信息，可以尝试按下ESP32的RESET按键。**

![RESET](./media/RESET.jpg)

---

